Xml 当试图通过服务类注入数据源bean时,如何修复NullException?

Xml 当试图通过服务类注入数据源bean时,如何修复NullException?,xml,web-services,spring,jdbc,dependency-injection,Xml,Web Services,Spring,Jdbc,Dependency Injection,因此,我有一个简单的REST web应用程序,如果我的控制器直接调用DAO,JDBC调用就可以正常工作,但是如果我的控制器调用另一个代表我调用DAO的类,它就会失败,出现NullPointerException(NPE) 这是我的控制器: @组件 @范围(“请求”) @路径(“/emsrequest”) 公共类EMSRequest{ //我用这个做测试 @得到 @路径(“/xml/{accountNumber}”) @产生({MediaType.TEXT_PLAIN}) 公共字符串request

因此,我有一个简单的REST web应用程序,如果我的控制器直接调用DAO,JDBC调用就可以正常工作,但是如果我的控制器调用另一个代表我调用DAO的类,它就会失败,出现NullPointerException(NPE)

这是我的控制器:

@组件
@范围(“请求”)
@路径(“/emsrequest”)
公共类EMSRequest{
//我用这个做测试
@得到
@路径(“/xml/{accountNumber}”)
@产生({MediaType.TEXT_PLAIN})
公共字符串requestByAccountNumber\u XML(
@PathParam(“accountNumber”)字符串(accountNumber){
ReqSubTest服务水平=新的ReqSubTest();
return“账号(LOS)为:“+LOS.testSql(Integer.parseInt(accountNumber))+”!”;
}
}
这是中级(服务)课程:

package com.company.demo.mercury.processmanager.components;
导入com.company.demo.pmrws.dao.EMSRequestDaoImpl;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Component;
@组成部分
公共类子测验{
@自动连线
EMSRequestDaoImpl dao=新的EMSRequestDaoImpl();
公共整数测试SQL(整数数量){
返回dao.getNextTableId(“系统进程”,数量);
}
}
下面是DAO的实现:

package com.company.demo.pmrws.dao;
导入org.apache.log4j.Logger;
导入org.springframework.jdbc.core.support.JdbcDaoSupport;
公共类EMSRequestDaoImpl扩展了jdbcdao支持{
私有静态最终记录器Logger=Logger.getLogger(EMSRequestDaoImpl.class);
public int getNextTableId(字符串表名,int数量){
if(logger.isDebugEnabled()){
trace(“输入GetNextTableId”);
}
if(getJdbcTemplate()==null){
System.out.println(“啊哦!”);
}
String selectSql=“选择下一个\u id”
+“来自系统键tbl”
+“其中表_name=?”;
字符串updateSql=“更新系统密钥”
+“设置下一个\u id=?”
+“其中表名=?和下一个表id=?”;
int lastId=-1;
int updateCount=0;
while(updateCount==0){
lastId=getJdbcTemplate().queryForInt(选择SQL,
新对象[]{tableName});
updateCount=getJdbcTemplate().update(updateSql,
新对象[]{lastId+数量,表名,lastId});
}
if(logger.isDebugEnabled()){
trace(“离开GetNextTableId”);
}
返回lastId+1;
}
}
应用程序上下文XML:



我错过了什么?顺便说一句,这是Spring2.5。我想我已经解决了这个问题。问题出在您的服务类
ReqSubTest

您已经在那里自动连接了DAO类,但不应该在那里初始化它。所以只要删除DAO声明的初始化部分,就可以开始了。现在您在服务类中的声明如下所示

@Autowired
private EMSRequestDaoImpl dao;
在控制器中,还需要自动连接服务类。不要在函数本身中创建它的新对象

@Autowired
private ReqSubTest service;

希望这对你有帮助。干杯。

我想我已经解决了这个问题。问题出在您的服务类
ReqSubTest

您已经在那里自动连接了DAO类,但不应该在那里初始化它。所以只要删除DAO声明的初始化部分,就可以开始了。现在您在服务类中的声明如下所示

@Autowired
private EMSRequestDaoImpl dao;
在控制器中,还需要自动连接服务类。不要在函数本身中创建它的新对象

@Autowired
private ReqSubTest service;

希望这对你有帮助。干杯。

这是因为
ReqSubTest los=newreqsubtest()创建一个新的普通java对象实例,但不创建Springbean,因此在
los
实例中没有注入任何内容

有三种方法可以解决这个问题

  • 而不是
    ReqSubTest los=new ReqSubTest()通过Spring注入
    los
    ,但这要求
    EMSRequest
    也是Springbean
例如:

@Component public class EMSRequest {

    @Autowire ReqSubTest los;

    public String requestByAccountNumber_XML(@PathParam("accountNumber") String accountNumber) {
        return "account (LOS) number is : " + los.testSql(Integer.parseInt(accountNumber)) + "!";
    } 
}
  • 而不是
    ReqSubTest los=new ReqSubTest()使用
    ReqSubTest los=springApplicationContext.getBean(ReqSubTest.class)
  • 如果您使用real AspectJ,那么您可以添加
    @Configurable
    ,然后Spring注入其他bean,即使实例是通过
    new
    创建的(需要通过
    启用)-您可以将注释添加到
    EMSRequest
    ,然后使用第一项中建议的正常注入,或者将其添加到
    ReqSubTest

    • 这是因为
      ReqSubTest los=newreqsubtest()创建一个新的普通java对象实例,但不创建Springbean,因此在
      los
      实例中没有注入任何内容

      有三种方法可以解决这个问题

      • 而不是
        ReqSubTest los=new ReqSubTest()通过Spring注入
        los
        ,但这要求
        EMSRequest
        也是Springbean
      例如:

      @Component public class EMSRequest {
      
          @Autowire ReqSubTest los;
      
          public String requestByAccountNumber_XML(@PathParam("accountNumber") String accountNumber) {
              return "account (LOS) number is : " + los.testSql(Integer.parseInt(accountNumber)) + "!";
          } 
      }
      
      • 而不是
        ReqSubTest los=new ReqSubTest()使用
        ReqSubTest los=springApplicationContext.getBean(ReqSubTest.class)
      • 如果您使用real AspectJ,那么您可以添加
        @Configurable
        ,然后Spring注入其他bean,即使实例是通过
        new
        创建的(需要通过
        启用)-您可以将注释添加到
        EMSRequest
        ,然后使用第一项中建议的正常注入,或者将其添加到
        ReqSubTest

      你能详细说明要点1吗?请举个例子,我加了一个例子。但这是否有效取决于什么时候