![](/img/trans.png)
[英]Spring Hibernate NullPointerException Dependency Injection
[英]NullPointerException on dependency injection with Spring
我有3种类型。
ServiceAffaire.java:
package ws.magicnew.sync;
...
@Transactional
@Service("serviceAffaire")
public class ServiceAffaire implements IServiceAffaire {
private static Log log = LogFactory.getLog(ServiceAffaire.class);
//private static SimpleDateFormat sdf = new SimpleDateFormat(MagicFacade.WS_DATE_FORMAT);
@Autowired
@Qualifier("manifestationService")
protected IManifestationService manifestationService;
@Autowired
@Qualifier("typeDeManifestationService")
protected ITypeDeManifestationService typeService;
@Autowired
@Qualifier("espaceManifestationService")
protected IEspaceManifestationService espaceManifService;
@Autowired
@Qualifier("siteService")
protected ISiteService siteService;
@Autowired
@Qualifier("natureService")
protected INatureService natureService;
@Autowired
@Qualifier("facadeGetAffaire")
protected MagicFacade facadeGetAffaire;
@Autowired
@Qualifier("compteurManifestation")
private Compteur compteurManifestation;
@Autowired
@Qualifier("compteurContenus")
protected Compteur compteurContenus;
public synchronized void synchronize(boolean setFlag) throws Exception {
...
}
}
IServiceAffaire.java:
package ws.magicnew.sync;
public interface IServiceAffaire {
public void synchronize(boolean setFlag) throws Exception;
}
和CacheAction.java:
package ws.magicnew.sync;
...
@Configurable
@Transactional
public class CacheAction extends DispatchAction {
private static Log log = LogFactory.getLog(CacheAction.class);
@Autowired
@Qualifier("serviceAffaire")
private IServiceAffaire serviceAffaire;
public ActionForward getAffaire(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
boolean setFlag = Boolean.parseBoolean(CmsProperties.SYNCRO_AFFAIRES_FLAG);
log.info("getAffaire debut " +setFlag);
serviceAffaire.synchronize(setFlag); // NullPointerException here: serviceAffaire is null
log.info("getAffaire fin " +setFlag);
request.setAttribute("message", "Le service get affaire a été lancé.");
return mapping.findForward("cache");
}
}
接线在applicationContext-scanpackages.xml文件中进行:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
<context:annotation-config />
<context:component-scan base-package="ws.magicnew.sync" />
<context:component-scan base-package="ws.magicnew.facade" />
</beans>
这对我来说似乎没问题,但是当我调用CacheAction.getAffaire()方法时,我仍然得到一个NullPointerException
。 我无法弄清楚为什么,它让我发疯。 任何线索?
我以前遇到过注入ServiceAffaire属性的问题(我解决了),所以Spring实际上是自动装配它们。 但由于某种原因,它无法将ServiceAffaire注入CacheAction。
如代码中的注释所示,当调用ServiceAffaire.synchronize时,serviceAffaire属性为null,正如我在调试模式下执行时所看到的那样。
你的问题可能是两件事:
首先,您需要在applicationContext-scanpackages.xml中添加“context:spring-configured”以启用AspectJ。
其次,你将CacheAction作为@Configurable,我想你这样做是因为你或某个框架用经典的“new CacheAction()”创建了CacheAction的实例,而不是让Spring创建它。
如果是这种情况,如果在Spring初始化IServiceAffaire bean之前通过代码创建CacheAction实例,则可能发生NPE。 我的意思是,当你使用“new”创建一个CacheAction实例时,你必须确保Spring已经完成初始化CacheAction所需的所有bean。 否则Spring将无法注入依赖项。
如果某个框架创建了CacheAction的新实例,并且无法控制何时创建这些实例,那么这可能会很棘手。 如果你添加像“depends-on”这样的注释并不重要,因为在完成创建需要注入的bean之前,Spring将无法保存该实例。
解决这个问题的一种方法是让Spring初始化一些bean,它会触发任何创建CacheAction新实例的初始化,并在那里添加一个“依赖”的IServiceAffaire bean。
无论如何,正确的解决方案取决于您的应用程序的初始化方式。
你能尝试将IServiceAffaire的依赖注入注释更改为@Resource并检查它是否有效
@Autowired
@Qualifier("serviceAffaire")
private IServiceAffaire serviceAffaire;
改成
@Resource(name ="serviceAffaire")
private IServiceAffaire serviceAffaire;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.