部署在 Tomcat 7 中的 Spring Boot WAR 尝试执行奇怪的自动 @Resource 查找 [英] Spring Boot WAR deployed in Tomcat 7 tries to perform weird automatic @Resource lookup

查看:14
本文介绍了部署在 Tomcat 7 中的 Spring Boot WAR 尝试执行奇怪的自动 @Resource 查找的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆