0

次のように、applicationContext.xml で spring の BasicDataSource を使用しています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-autowire="byType">

    <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/school" />
        <property name="username" value="root" />
        <property name="password" value="" />
        <property name="initialSize" value="5" />
        <property name="maxActive" value="10" />
    </bean>
</beans>

そして、次のようにコントローラーでこのBeanを使用すると:

package admin.controller;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.inject.*;

@Controller
public class Welcome {

@Inject
BasicDataSource datasource;

private static final String WELCOME_PAGE = "welcome";

@RequestMapping("/")
public String welcome(ModelMap model){

    Connection con=null;
    PreparedStatement stmt =null;
    String testQuery = "INSERT INTO ADMIN(ID,USER_NAME,PASSWORD,FIRST_NAME,LAST_NAME) VALUES(?,?,?,?,?)";
    try {
        con = datasource.getConnection();
        stmt = con.prepareStatement(testQuery);

        stmt.setInt(1, 4);
        stmt.setString(2, "ij");
        stmt.setString(3, "kl");
        stmt.setString(4, "mn");
        stmt.setString(5, "op");

        stmt.execute();

        //con.commit();
    } catch (SQLException e) {
        e.printStackTrace();
    } 
    finally{
            try {
                if(con!=null)
                    con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    }
    return WELCOME_PAGE;
}   
}

次に、次の行でnullpointer例外が発生します: datasource.getConnection();

コントローラー内に BasicDatasource の新しいインスタンスを作成し、そのセッター メソッド (例: datasource.setDriverClassName など) を使用して詳細を追加すると、データベースに接続して問題なくクエリを実行するため、接続の詳細は 100% 正しいです。しかし、アプリケーション コンテキストから Bean を使用したい場合、null ポインター例外が発生します。

4

2 に答える 2

0

@Inject を @Autowired に置き換えると問題なく動作し、セッター メソッドを記述する必要がないという別の興味深い事実に出会いました。しかし、@Inject を使用している場合は、それを機能させるためにセッター メソッドを作成する必要があります。奇妙に聞こえますが、私の場合は本当のようです。

于 2013-01-12T14:47:37.043 に答える
0

nullポインター例外が発生する理由がわかりません。しかし、バインディングのどこかで間違いを犯していると確信しています。@Inject を削除してデータ ソースのセッター メソッドを実装すると、他の例外が発生しないためです。そして無事取引完了。問題を指摘できる場合はお知らせください。

于 2013-01-12T13:01:37.490 に答える