部署在 Tomcat 7 中的 Spring Boot WAR 尝试执行奇怪的自动 @Resource 查找 [英] Spring Boot WAR deployed in Tomcat 7 tries to perform weird automatic @Resource lookup
问题描述
我使用 Spring Boot 1.2.5 创建了一个可部署的 WAR 并尝试在 Tomcat 7.0.69 中部署它.发生的是一组非常奇怪的错误,看起来我在依赖注入 bean 的代码中使用的每个 @Resource 注释都是通过 JNDI 查找的:
I created a deployable WAR using Spring Boot 1.2.5 and tried to deploy it in Tomcat 7.0.69. What happens is a really weird set of errors, looks like every @Resource annotation I used in the code for dependency injection beans is being looked up via JNDI:
SEVERE: Exception starting filter externalProviderAuthenticationFilter
javax.naming.NameNotFoundException: Name [com.graffitab.server.api.authentication.ExternalProviderAuthenticationFi lter/userService] is not bound in this Context. Unable to find [com.graffitab.server.api.authentication.ExternalProviderAuthenticationFilter].
at org.apache.naming.NamingContext.lookup(NamingContext.java:819)
at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
at org.apache.catalina.core.DefaultInstanceManager.lookupFieldResource(DefaultInstanceManager.java:559)
at org.apache.catalina.core.DefaultInstanceManager.processAnnotations(DefaultInstanceManager.java:449)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:135)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:128)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4830)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5510)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1081)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1877)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我将该过滤器定义为:
@Log4j2
public class ExternalProviderAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
@Resource
private UserService userService;
@Resource(name = "delegateJacksonHttpMessageConverter")
private MappingJackson2HttpMessageConverter jsonConverter;
public ExternalProviderAuthenticationFilter() {
super(new AntPathRequestMatcher("/api/externalproviders/login", "POST"));
}
...
在配置类中:
@Bean
public ExternalProviderAuthenticationFilter externalProviderAuthenticationFilter() throws Exception {
ExternalProviderAuthenticationFilter externalProviderFilter =
new ExternalProviderAuthenticationFilter();
externalProviderFilter.setAuthenticationManager(authenticationManager());
externalProviderFilter.setAuthenticationSuccessHandler(storeSessionJsonLoginSuccessHandler());
externalProviderFilter.setAuthenticationFailureHandler(jsonLoginFailureHandler());
return externalProviderFilter;
}
为什么独立的 Tomcat 对 @Resource 感到困惑?它还尝试查找数据源.该应用程序在运行嵌入式 Tomcat 时运行良好,但我需要它在嵌入式 Tomcat 中运行.
Why is standalone Tomcat confused about the @Resource? It also tries to lookup the datasource. The app is working fine when running embedded Tomcat, but I need it to work in an embedded Tomcat.
推荐答案
@Resource
是一个通用的java注解,对Tomcat有一个意义:
@Resource
is a generic java annotation with a meaning to Tomcat:
也是春天的意义:
@Bean
另一方面是一个仅限 spring 的 DI 注释,Tomcat 不会干扰.
@Bean
on the other hand is a spring-only DI annotation and Tomcat won't interfere.
对您来说最简单的解决方案是使用 Spring 的 @Autowired
注释(@Inject
也可能工作).Tomcat 会忽略这些.
The simplest solution for you would be to use Spring's @Autowired
annotation (@Inject
might work too). Tomcat will ignore these.
您的另一个选择是在 Tomcat 中禁用该行为,我认为这是 enableNaming
选项.
Your other option would be to disable that behavior in Tomcat, I think it's the enableNaming
option.
这篇关于部署在 Tomcat 7 中的 Spring Boot WAR 尝试执行奇怪的自动 @Resource 查找的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!