因此,我有一个简单的 REST Web 应用程序,如果我的控制器直接调用 DAO,则 JDBC 调用工作正常,但如果我的控制器调用另一个代表我调用 DAO 的类,它会因 NullPointerException (NPE) 而失败。
这是我的控制器:
@Component
@Scope("request")
@Path("/emsrequest")
public class EMSRequest {
// I'm using this for testing
@GET
@Path("/xml/{accountNumber}")
@Produces({MediaType.TEXT_PLAIN})
public String requestByAccountNumber_XML(
@PathParam("accountNumber") String accountNumber) {
ReqSubTest los = new ReqSubTest();
return "account (LOS) number is : " + los.testSql(Integer.parseInt(accountNumber)) + "!";
}
}
这是中间(服务)类:
package com.company.demo.mercury.processmanager.components;
import com.company.demo.pmrws.dao.EMSRequestDaoImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ReqSubTest {
@Autowired
EMSRequestDaoImpl dao = new EMSRequestDaoImpl();
public int testSql(int quantity){
return dao.getNextTableIds("sys_process_tbl", quantity);
}
}
这是 DAO 的实现:
package com.company.demo.pmrws.dao;
import org.apache.log4j.Logger;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class EMSRequestDaoImpl extends JdbcDaoSupport {
private static final Logger logger = Logger.getLogger(EMSRequestDaoImpl.class);
public int getNextTableIds(String tableName, int quantity) {
if (logger.isDebugEnabled()) {
logger.trace("Entering getNextTableIds");
}
if (getJdbcTemplate() == null) {
System.out.println("UH OH!");
}
String selectSql = "select next_id "
+ "from sys_key_tbl "
+ "where table_name = ? ";
String updateSql = "update sys_key_tbl "
+ "set next_id = ? "
+ "where table_name = ? and next_id = ? ";
int lastId = -1;
int updateCount = 0;
while (updateCount == 0) {
lastId = getJdbcTemplate().queryForInt(selectSql,
new Object[]{tableName});
updateCount = getJdbcTemplate().update(updateSql,
new Object[]{lastId + quantity, tableName, lastId});
}
if (logger.isDebugEnabled()) {
logger.trace("Leaving getNextTableIds");
}
return lastId + 1;
}
}
应用程序上下文 XML:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.company.demo.pmrws"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.sybase.jdbc3.jdbc.SybDataSource" />
<property name="url"
value="jdbc:sybase:Tds:blah:10240/BLAH_DB1" />
<property name="username" value="blah" />
<property name="password" value="blah" />
</bean>
<bean id="dataSourceMain" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.sybase.jdbc3.jdbc.SybDataSource" />
<property name="url"
value="jdbc:sybase:Tds:blah:10240/BLAH_DB2" />
<property name="username" value="blah" />
<property name="password" value="blah" />
</bean>
</bean>
<!-- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>-->
<bean id="emsResponseDao" class="com.company.demo.pmrws.dao.EMSResponseDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="emsStatusDao" class="com.company.demo.pmrws.dao.EMSStatusDaoImpl">
<property name="dataSource" ref="dataSourceMain" />
</bean>
<!-- <bean id="collateralSybaseEmsDao" class="com.company.demo.dao.CollateralSybaseEmsDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="collateralSybaseDao" class="com.company.demo.dao.CollateralSybaseDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>-->
<bean id="emsRequestDao" class="com.company.demo.pmrws.dao.EMSRequestDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<context:component-scan base-package="com.company.demo.mercury.processmanager.components" />
</beans>
我错过了什么?顺便说一句,这是 Spring 2.5。