我在RMI服务中的@autowired对象上获得NULL指针异常。 我创建了一个简单的(我认为)服务,通过RMI从客户端调用。代码为
package com.edvs.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.edvs.dao.HostStatusDao;
@Controller
public class HeartbeatImpl implements Heartbeat {
private static final long serialVersionUID = 7502560843009449650L;
@Autowired
private HostStatusDao hs;
@Override
public int update(String hostSequenceNumber) {
int cnt = hs.update(hostSequenceNumber);
return cnt;
}
}//End of file HeartbeatImpl.java.
heartbeat-servlet.xml代码如下:
<bean id="heartbeatBean" class="com.edvs.service.HeartbeatImpl">
<!-- Nothing here for now. -->
</bean>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- does not necessarily have to be the same name as the bean to be exported -->
<property name="serviceName" value="Heartbeat"/>
<property name="service" ref="heartbeatBean"/>
<property name="serviceInterface" value="com.edvs.service.Heartbeat"/>
<!-- defaults to 1099 -->
<property name="registryPort" value="1199"/>
</bean>
我指定组件扫描的WebConfiguration文件如下:
@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan({ "com.edvs.controller","com.edvs.service" })
public class WebConfiguration extends WebMvcConfigurerAdapter {
My HeartbeatImpl.java位于com.edvs.service包中,因此应该对其进行扫描,并且应该实例化@autowired HostStatusDao,但事实并非如此。属性hs为NULL,产生NULL异常。
我在这个系统中有很多控制器使用完全相同的@Autowired技术,它们工作正常。对象被实例化。我怀疑这个类因heartbeat-servlet.xml文件中的Bean定义而失败。我真的在这里解决问题。我必须遗漏一些阻止@Autowired工作的扫描程序的东西。任何帮助将不胜感激。
答案 0 :(得分:0)
对不起,如果我浪费了任何人的时间,但我想我在大云中找到了答案。我像这样添加了接口ApplicationContextAware。
public class HeartbeatImpl implements Heartbeat, ApplicationContextAware {
这需要方法setApplicationContext。在该方法中,我实例化我的属性hs。
@Override
public void setApplicationContext(ApplicationContext ctx)
throws BeansException {
hs = (HostStatusDao) ctx.getBean("HostStatusDao");
}
我希望这有助于其他人,因为我花了一整天的时间才弄清楚这一点。