0

こんにちは、この春、MVCとJdBCのサポートは初めてです。mysqlデータベースに接続できるようにしたいのですが、Webを実行するとnullが返されます。以下のコードは簡単なはずですが、ここで何が欠けていますか?すべての返信をありがとう

以下は、URLを照会しようとしたときの私のエラーです

java.lang.NullPointerException
com.simple.myacc.dao.JdbcContactDao.findAll(JdbcContactDao.java:55)
com.simple.myacc.ContactController.getAll(ContactController.java:44)

私のspring.xml

.....

<context:component-scan base-package="com.simple.myacc" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/jsp/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/webcontact" />
    <property name="username" value="root" />
    <property name="password" value="password" />
</bean>

<bean id="jdbcContactDao" class="com.simple.myacc.dao.JdbcContactDao">
    <property name="dataSource" ref="dataSource" />
</bean>

私のJdbcContactDao

public class JdbcContactDao {
protected static Logger logger = Logger.getLogger("service");
private DataSource dataSource;
private JdbcTemplate jdbcTemplate;

public JdbcContactDao() {

}

public List<Contact> findAll() {

    String sql = "select * from contact";
    List<Contact> contacts = new ArrayList<Contact>();
    List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
    for (Map rs : rows) {
        Contact contact = new Contact();
        contact.setId((Integer) rs.get("id"));
        contact.setFirstname((String) rs.get("firstname"));
        contact.setLastname((String) rs.get("lastname"));
        contact.setEmail((String) rs.get("email"));
        contact.setPhone((String) rs.get("phone"));
        contacts.add(contact);
    }
    return contacts;
}

@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;

} }

私のコントローラー、その一部

@RequestMapping(value="/contact/list2",method = RequestMethod.GET)
public String getAll(ModelMap model) {
    dao=new JdbcContactDao();
    List<Contact> contacts = dao.findAll();

     // Attach persons to the Model
     model.addAttribute("contacts", contacts);


     return "contact.list";

}

これはNULLを言う行です

        List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
4

4 に答える 4

1

JdbcTemplate クラスを使用する場合の一般的なイディオムは、Spring 構成ファイルで DataSource を構成し、その共有 DataSource Bean を DAO クラスに依存性注入することです。JdbcTemplate は、DataSource のセッターで作成されます。プライベート JdbcTemplate jdbcTemplate;

public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

詳細については、こちらをご覧ください

コードは次のようになります

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/webcontact" />
<property name="username" value="root" />
<property name="password" value="password" />

これは必要ありません

<bean id="jdbcContactDao" class="com.simple.myacc.dao.JdbcContactDao">
<property name="dataSource" ref="dataSource" />

代わりにこれを行う

 @Autowired
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

JdbcContactDao クラスに @Repository で注釈を付けます

于 2012-07-17T15:38:51.393 に答える
0

java/jdbc String sql = "select user_name from table" を使用して古いテーブルに接続する際にも同様の問題がありました

jdbc.queryForList(sql); 

queryReturnList = jdbc.queryForList(sql);  

    for (Map mp : queryReturnList){          
        String userName = (String)mp.get("user_name");          
}

userName は常に null でした。返された値のマップを調べると、マップが user_name を使用していないことがわかりましたが、「ユーザー名」のテーブルに設定されたラベルは DBA の修正が必要でした。お役に立てれば

于 2015-09-22T20:17:59.717 に答える
0

JdbcContactDao の 55 行目はこれだと思いList<Map<String, Object>> rows = jdbcTemplate.queryForList(sql); ます。jdbcTemplate を宣言しますが、値を指定することはなく、注入用の注釈も付けられていないため、常に null になります。そのため、使用しようとすると NPE が発生します。

于 2012-07-17T15:25:33.183 に答える
0

設定ファイルで dataSource と JdbcContactDAO Bean が設定されています。同じように、jdbcContactDAO Bean をコントローラーに注入する必要があります。

<bean id="myController" class="mypath.MyController">
<property name="dao" ref="jdbcContactDao"/>
</bean>

そしてあなたのコントローラーで....

public JdbcContactDao dao;

@Resource(name="dao")
public void setDao(JdbcContactDao dao){
    this.dao = dao;
}


@RequestMapping(value="/contact/list2",method = RequestMethod.GET)
public String getAll(ModelMap model) {

    List<Contact> contacts = dao.findAll();

    // Attach persons to the Model
    model.addAttribute("contacts", contacts);


    return "contact.list";

}
于 2012-07-17T15:45:51.743 に答える