java - Tomcat 7 中部署的 Spring Boot WAR 尝试执行奇怪的自动 @Resource 查找

标签 java spring spring-boot

我使用 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/

相关文章:

java - 用于在 Java 中存储通用类型对象的异构容器

java - 在 Android 布局调用中使用变量

java - 如何设置 JScrollPane 只显示特定数量的行

java - 使用 Spring 在 weblogic 中的服务器启动时启动线程

java - 使用应用程序属性填充的 HashMap Autowiring bean 不起作用

java - Spring Initializr 项目无法运行并出现多个错误

java - 由 : java. lang.ClassNotFoundException : Could not load requested class : org. springframework.orm.hibernate4.SpringSessionContext 引起

java - 在 Eclipse for Mac 上转换为 Dalvik 格式失败,出现错误 1

java - Spring Boot中使用多个数据源时如何设置多个连接池?

java - Spring 3.2 默认为 @Autowired