java SpringBeanAutowiringInterceptor抛出NoSuchBeanDefinitionException

qxsslcnc  于 2023-05-27  发布在  Java
关注(0)|答案(4)|浏览(127)

我正在尝试使用@Interceptors(SpringBeanAutowiringInterceptor.class)注解使用Spring将bean自动连接到EJB。问题是,在示例化EJB时,我一直在获取自动连接类的NoSuchBeanDefinitionException。(在我的例子中的Filter类)。
我使用的是Java EE 6应用程序(EJB 3.0),Spring 4.2.2由Maven管理,并在WebSphere 7 AS中运行。
我有以下Spring依赖项:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.ldap</groupId>
    <artifactId>spring-ldap-core</artifactId>
    <version>2.0.4.RELEASE</version>
    <exclusions>
        <exclusion>
            <artifactId>spring-tx</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
    </exclusions>
</dependency>

实施:

@Stateless
@Remote(ServiceRemote.class)
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class Service implements ServiceRemote {

@Autowired
private Filter filter;

...

}

要自动连线的类

@Component
public class FilterImpl implements Filter { ... }

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" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="businessBeanFactory"
        class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg value="classpath*:applicaion-context.xml" />
    </bean>
</beans>

application-context.xml和bean定义:

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <bean class="com.FilterImpl" />

</beans>

这两个XML都在类路径中,就像它们在src/main/resources/中一样。
我尝试了一些调试以下代码,但无法找到有用的东西。

BeanFactoryLocator factoryLocator = ContextSingletonBeanFactoryLocator.getInstance("classpath:beanRefContext.xml");

BeanFactoryReference ref = factoryLocator.useBeanFactory("businessBeanFactory");
BeanFactory factory = ref.getFactory();

FilterImpl instance = factory.getBean(FilterImpl.class);

当EJB第一次示例化时,两个上下文似乎都被加载了,因为我得到了如下所示的日志。

org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7730773; root of context hierarchy
org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions Loading XML bean definitions from URL [file:/C:/project/service-module/target/classes/beanRefContext.xml]
org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5580558: root of context hierarchy

但是在那之后Spring找不到我在application-context.xml中定义的bean。
application-context.xml中,我尝试使用<context:component-scan base-package="com"/>而不是<bean class="com.FilterImpl" />,但得到的结果相同。
我是否缺少一些配置?

修改:增加了Steve C的建议和上下文加载日志

nzrxty8p

nzrxty8p1#

将xml配置文件从src/main/java移动到src/main/resources
src/main/java中的文件只能由maven-compiler-plugin处理。
额外的资源文件由maven-resources-plugin处理,它从src/main/resources复制文件。

xpszyzbs

xpszyzbs2#

您似乎没有在spring xml文件中添加<context:annotation-config/>

ldioqlga

ldioqlga3#

我刚刚找到了答案。在<constructor-arg value="classpath*:applicaion-context.xml" />中有一个applicaion-context.xml,而它应该是application-context.xml。当我编辑问题并发布关于上下文加载的日志时,我注意到只有beanRefContext.xml加载了它的定义。没有关于一些解析错误的日志,我只是忽略了这种可能性。现在一切正常。

fumotvh3

fumotvh34#

我正在考虑为这个拦截器添加一个自动测试,但我不知道如何做到这一点?知道吗?

相关问题