java - Spring Web Mvc 配置初始化

标签 java spring spring-mvc autowired

我正在尝试通过 spring java @Configuration 配置一堆库。
其中最重要的是我有一个 Spring Web Mvc 应用程序。

为了配置应用程序,我使用了 AbstractAnnotationConfigDispatcherServletInitializer 的扩展;从那里,我在 getRootConfigClasses() 方法中为底层引用了另一个 @Configuration 类,对于 servlet 容器,我使用了 getServletConfigClasses() 方法来引用 WebMvcConfigurationSupport 的扩展。

一切都运行良好(Web MVC 部分),直到我需要来自在 WebMvcConfigurationSupport 级别实例化的类(拦截器等)的底层的一些 bean;在这些类中,所有对应在底层(即用 @Component 注释的类)和 @Autowired 注释进行初始化的 bean 的引用都会给我 null .

在同一层堆栈(没有 MVC 的服务层)之上的另一个应用程序中,一切都运行良好。

有什么建议吗?

编辑

如果我从根配置类加载一个bean(通过@Bean注释), Autowiring 工作。
如果我从 servlet (WebMvc) 配置类加载一个 bean(通过 @Bean 注释), Autowiring 将不起作用。

看起来它们是两个不同的 Spring 上下文。

一些代码

拦截器

package my.package.interceptor;

@Component
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {...}

根配置

package my.package;

@Configuration
@ComponentScan(
            basePackageClasses={ UnderlyingLayersSpringConfiguration.class }, 
            basePackages = {"my.package.interceptor"}
)

public class WebSpringConfiguration {...}

MVC 配置

package my.package;

@Configuration
@EnableWebMvc
@ComponentScan(
            basePackageClasses = WebSpringConfiguration.class, 
            basePackages = {"my.package.interceptor"}, 
            includeFilters = @Filter(Controller.class) , 
            useDefaultFilters = false
            )
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private AuthenticationInterceptor authenticationInterceptor;
}

网络应用初始值设定项:2 个版本
版本1

package my.package;

public class WebAppInitializer 
extends AbstractAnnotationConfigDispatcherServletInitializer 
implements WebApplicationInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { WebSpringConfiguration.class, WebMvcConfig.class };

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }
}

版本 2

package my.package;

public class WebAppInitializer 
extends AbstractAnnotationConfigDispatcherServletInitializer 
implements WebApplicationInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { WebSpringConfiguration.class };

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return  new Class<?>[] { WebMvcConfig.class };
    }
}

错误

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [my.package.interceptor.AuthenticationInterceptor] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

最佳答案

我发现了这个问题,并在这里报告了答案,以供将来内存,并允许其他人在遇到相同问题时检查 Spring 配置的这方面。

底层的bean继承自使用spring @Profile的类结构。

我无法加载bean,因为在最顶层的项目中我没有指定@Profile,所以没有配置文件,没有bean。

很简单,考虑一下就可以了。

希望这可以帮助别人。

关于java - Spring Web Mvc 配置初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36769663/

相关文章:

java - 在 oAuth2 资源服务器应用程序中使用@WithMockUser(与@SpringBootTest)

Spring MVC + Hibernate 验证器 : how can I override/internationalize the default error messages?

java - Java中的延续错误

java - 从 1 到 20 查找 lcm,给出错误 "at Main.gcd(Main.java:21)"

java - Spring 工具套件在 maven-jaxb2-plugin 的 <execution> 上显示错误

java - 在网络应用程序中发送文件后如何删除文件?

java - 如何在 Spring MVC 3 中实现分页

java - 当线程完成并调用 dialog.dismiss() 时出现 WindowLeaked 异常;

java - SocketChannel.write 是否等待 TCP ACK?

java - c3p0 和 hibernate 用户/密码覆盖