我使用 Spring Boot 1.2.5 创建了一个可部署的 WAR,并尝试将其部署在 Tomcat 7.0.69 中。发生的是一组非常奇怪的错误,看起来我在依赖注入(inject) bean 代码中使用的每个 @Resource 注释都是通过 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 中工作。
最佳答案
@Resource
是一个通用的 java 注释,对 Tomcat 的意义是:
对 Spring 也有一定的意义:
另一方面,@Bean
是仅限 spring 的 DI 注释,Tomcat 不会干扰。
最简单的解决方案是使用 Spring 的 @Autowired
注释(@Inject
也可能有效)。 Tomcat 将忽略这些。
您的另一个选择是在 Tomcat 中禁用该行为,我认为是 enableNaming
option .
关于java - Tomcat 7 中部署的 Spring Boot WAR 尝试执行奇怪的自动 @Resource 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37690617/