有继承时spring注入空指针问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有继承时spring注入空指针问题相关的知识,希望对你有一定的参考价值。

我有一个接口BaseService和实现类BaseServiceImpy,这个接口提供一些公用方法,其余Service继承这个BaseService。
在BaseService接口内注入BaseDao,这个BaseDao也是提供一些通用方法的。

在spring中注入如下:
<bean id="baseDao" class="com.dao.impy.BaseDaoImpy">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseService" class="com.service.impy.BaseServiceImpy">
<property name="baseDao" ref="baseDao"></property>
</bean>

举例来说,我在BaseService中提供一个方法:
public List findByHql(String hql);
其实现类中具体实现为:

public List findByHql(String hql)
this.baseDao.findByHql(hql); //baseDao以实现此方法。


现在我有一个具体业务的Service名为UserService:

public interface UserService extends BaseService;

当我在action中通过userService调用findByHql(String hql);方法时,报空指针异常,断点发现是baseDao== null,并未注入进去,这是为什么呢?
楼下说的虽然都不正确,但还是谢谢各位。
解决方法是,不许在子类,也就是userService的Spring配置中注入baseDao

你提供了baseDao的set方法了没 参考技术A bean需要提供一个无参数的构造函数 参考技术B 应该是1楼说的那样你没提供baseDao的set方法!

Spring 注入 MessageDrivenBean 不起作用 - 空指针 - jboss eap 7

【中文标题】Spring 注入 MessageDrivenBean 不起作用 - 空指针 - jboss eap 7【英文标题】:Spring Injection into MessageDrivenBean does not work - null pointer - jboss eap 7 【发布时间】:2017-07-07 07:36:17 【问题描述】:

我有一个 MDB,它将通过自动装配获得它的 messageHandler 实现。 但是在运行时这个对象是空的。甚至从未达到设置器处的断点。 当 BaseMDB 的 onMessage 方法中有一个断点时(由下面的 MDB 扩展),它到达并且我可以看到 messageHandler-object 为空。 然后我得到一个空指针异常。 这就是为什么我认为自动装配不起作用。

我的 MDB 如下所示:

@MessageDriven(name = "MyProjectIntern-Bean", activationConfig = 
                                                                 @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
                                                             @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/q_myproject_intern") )
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class MyprojectInternMDB extends BaseMDB implements MessageListener 

    @Override
    @Autowired
    public void setMessageHandler(@Qualifier("myprojectInternalMessageHandler") MessageHandler messageHandler) 
        this.messageHandler = messageHandler;
    

从我读过的内容开始,SpringBeanAutowiringInterceptor 使用默认工厂,因此我需要将 beanRefContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="server.context" class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
            <list>
                <value>/container-context.xml</value>
                <value>/services-context.xml</value>
                <value>/techcommon-context.xml</value>
                <value>/container-services-context.xml</value>
                <value>/container-context-timb.xml</value>
                <value>/fxp-services-context.xml</value>
                <value>/stm-services-context.xml</value>
            </list>
        </constructor-arg>
    </bean>
</beans>

在启动时,jboss 控制台还显示所有这些 xml 文件都是从 beanRefContext.xml 加载的:

Loading XML bean definitions from URL [<pathTobeanRefContext.XML][...]

所以我认为它的相关性在于类路径。

在 container-context.xml 中包含以下条目:

<context:annotation-config/>

在 container-services-context.xml 中,有以下几行:

<bean id="internalMessageHandler" class="com.myproject.server.message.InternalMessageHandler">
    <qualifier value="myprojectInternalMessageHandler" />
</bean>

所以我的 MDB 有一个拦截器,它应该使用给定的限定符注入 messageHandler。 MessageHandler 被定义为具有相同限定符并引用应注入的类的 bean。 这个 bean 是在一个 xml 文件中定义的,该文件又通过 beanRefContext.xml 加载。

那么我还需要什么?

也许对我的部署有些话。 有一个 ear-file 包含 a)我的 MDB 作为单独的 jar 模块和 b)一个包含我的 Web 应用程序的 war 文件和 c)包含所有使用的库(包括要注入的 messageHandler 类)的 lib 文件夹和 meta-inf。

如果您需要任何进一步的信息,请直接询问。 感谢您的帮助。

【问题讨论】:

也许问题是 Spring API 文档所说的:“注意:如果您的 EJB 类加载器中有多个共享的 ApplicationContext 定义,您需要”应用程序(一个耳朵项目)拥有一些 jar -modules(也使用 spring 和自动装配)、一个 ejb 模块(包含消息驱动的 bean)和一个 war 模块(包含 webapp)。但是由于文档说“符合 EJB3 的拦截器类”,我认为也应该支持 ejb-modules。 我没有真正的来源,但我认为战争项目可以访问外耳项目中的所有库并初始化它自己的应用程序上下文。但是直接放置在 ear-module 下的 EJB-Module 无法访问现在保存在内部 war-module 中的应用程序上下文。我的意思是ejb不能调查战争。这种清晰的分离多年来一定是新的,因为谷歌上的多次点击表明通过战争模块也很容易共享上下文。目前我无法将 ejb 集成到战争模块中。 【参考方案1】:

我通过添加描述的内容解决了它

<module name="test.module" annotations="true" />

发现于: https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.0/html/development_guide/class_loading_and_modules#add_an_explicit_module_dependency_to_a_deployment

【讨论】:

以上是关于有继承时spring注入空指针问题的主要内容,如果未能解决你的问题,请参考以下文章

spring注入问题空指针

Spring 注入 MessageDrivenBean 不起作用 - 空指针 - jboss eap 7

请高手看看spring注入问题,这里一登陆就报空指针。

spring bean注入报空指针null,但set设值时对象是存在的,而且只是部分方法报空指针

SpringBug记录 -- java.lang.NullPointerException在Spring单元测试中遇到的空指针异常及依赖注入异常总结

在使用schedule创建定时任务时,出现空指针的解决方式。