Spring Web Mvc配置初始化
Spring Web Mvc configuration initialization
我正在尝试通过 spring java @Configuration
.
配置一堆库
最重要的是我有一个 Spring Web Mvc 应用程序。
为了配置应用程序,我使用了 AbstractAnnotationConfigDispatcherServletInitializer
的扩展;从那里我为 getRootConfigClasses()
方法中的底层引用了另一个 @Configuration
class,对于 servlet 容器,我使用 getServletConfigClasses()
方法引用 getServletConfigClasses()
的扩展 WebMvcConfigurationSupport
。
一切正常(Web MVC 部分),直到我需要来自 classes 的底层的一些 bean,这些 bean 在 WebMvcConfigurationSupport
级别实例化(拦截器等);在那些 classes 中,所有对 bean 的引用都应该在底层(即 classes 用 @Component
注释)用 @Autowired
注释初始化给我 null
.
在同一层堆栈(没有 MVC 的服务层)之上的另一个应用程序中,一切正常。
有什么建议吗?
编辑
如果我从根配置加载一个 bean(通过 @Bean 注释)class 自动装配工作。
如果我从 servlet (WebMvc) 配置加载一个 bean(通过 @Bean 注释)class 自动装配不起作用。
它们似乎是两个不同的 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;
}
Web 应用初始化程序: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)}
根上下文和调度程序servlet 上下文确实是两个不同的上下文。根上下文是 servlet 上下文的父级。
您可能没有在 class 配置 servlet 上下文时指定 @ComponentScan
注释。
我发现了这个问题并在这里报告了答案,以备将来记忆并允许其他人在遇到相同问题时检查 spring 配置的这方面。
底层的 bean 继承自 类 的结构,其中使用了 spring @Profile
。
我无法加载 beans,因为在最顶层的项目中我没有指定 @Profile
,所以没有配置文件,没有 beans。
很简单,有时间再考虑。
希望这对某人有所帮助。
我正在尝试通过 spring java @Configuration
.
配置一堆库
最重要的是我有一个 Spring Web Mvc 应用程序。
为了配置应用程序,我使用了 AbstractAnnotationConfigDispatcherServletInitializer
的扩展;从那里我为 getRootConfigClasses()
方法中的底层引用了另一个 @Configuration
class,对于 servlet 容器,我使用 getServletConfigClasses()
方法引用 getServletConfigClasses()
的扩展 WebMvcConfigurationSupport
。
一切正常(Web MVC 部分),直到我需要来自 classes 的底层的一些 bean,这些 bean 在 WebMvcConfigurationSupport
级别实例化(拦截器等);在那些 classes 中,所有对 bean 的引用都应该在底层(即 classes 用 @Component
注释)用 @Autowired
注释初始化给我 null
.
在同一层堆栈(没有 MVC 的服务层)之上的另一个应用程序中,一切正常。
有什么建议吗?
编辑
如果我从根配置加载一个 bean(通过 @Bean 注释)class 自动装配工作。
如果我从 servlet (WebMvc) 配置加载一个 bean(通过 @Bean 注释)class 自动装配不起作用。
它们似乎是两个不同的 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;
}
Web 应用初始化程序: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)}
根上下文和调度程序servlet 上下文确实是两个不同的上下文。根上下文是 servlet 上下文的父级。
您可能没有在 class 配置 servlet 上下文时指定 @ComponentScan
注释。
我发现了这个问题并在这里报告了答案,以备将来记忆并允许其他人在遇到相同问题时检查 spring 配置的这方面。
底层的 bean 继承自 类 的结构,其中使用了 spring @Profile
。
我无法加载 beans,因为在最顶层的项目中我没有指定 @Profile
,所以没有配置文件,没有 beans。
很简单,有时间再考虑。
希望这对某人有所帮助。