繁体   English   中英

Spring 启动和 Jersey 过滤器与依赖注入

[英]Spring boot and Jersey Filter with Dependency Injection

使用 Jersey 启动 Spring,我想使用一些内部使用依赖注入的过滤器。

问题是,Jersey 服务器似乎无法使用 Spring 的 ApplicationContext,我们在其中定义了该依赖关系。

这里是 JerseyConfiguration

@Configuration
public class JerseyConfig extends ResourceConfig {

    private static final String CONTEXT_CONFIG = "contextConfig";

    private static final String RESOURCE_PACKAGE = "presentation.resource";

    public JerseyConfig() {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        applicationContext.refresh();
        property(CONTEXT_CONFIG, applicationContext);
        register(SpringLifecycleListener.class);
        register(MyFilter.class); //Filter I want to use 
        packages(RESOURCE_PACKAGE);
    }
}

这里是具有@Autowire的过滤器

@Priority(40)
@Primary
@Provider
@MyFilter
class MyFilter(@Context var resourceInfo: ResourceInfo) extends ContainerRequestFilter with DefaultRuntime {

  implicit var finagleService: CommonFinagleService = _

  @Primary
  @Autowired(required = false)
  def setHttpFinagleService(@Autowired(required = false)
                            @Primary
                            _finagleService: CommonFinagleService): Unit = {
    finagleService = _finagleService
    finagleService.init(getProperties())
  }

  override def filter(context: ContainerRequestContext): Unit = {
    logger.debug(null, "filter running.....")
  }
}

这是applicationContext.xml的外观

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

    <bean id="httpFinagleService" class="foo.bla.CommonFinagleService"/>

</beans>

最后Spring boot主 class

@Configuration
@SpringBootApplication(exclude = {org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration.class,
        org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.class,
        org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration.class,
        org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class})
public class SpringBootRestApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {

        new SpringBootRestApplication().configure(new SpringApplicationBuilder(SpringBootRestApplication.class)).run(args);
    }

我运行主 class,调用 JerseyConfig class,我可以注册过滤器。 不幸的是,一旦服务运行,当我向一个端点运行请求时,过滤器被调用到setHttpFinagleService方法,传递CommonFinagleService的 null 依赖项

我也在使用jersey-spring4依赖

<dependency>
            <groupId>org.glassfish.jersey.ext</groupId>
            <artifactId>jersey-spring4</artifactId>
            <version>2.27</version>
        </dependency>

而 Spring 启动和 Spring 是 2.1.0 和 5.1.8

知道这里可能出了什么问题

使用 Grizzly + Jersey 一切正常。

问候

您需要将MyFilter选择的 MyFilter 设为 Bean,

添加到 class 级别@Component并确保它被组件扫描拾取,如果你有

请注意,如果您使用 Spring DI,此处@Provider可能是多余的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM