gpt4 book ai didi

java - 带依赖注入(inject)的 Spring boot 和 Jersey 过滤器

转载 作者:行者123 更新时间:2023-12-01 21:11:36 25 4
gpt4 key购买 nike

有了带有 Jersey 的 Spring 启动,我想使用一些内部使用依赖注入(inject)的过滤器。

问题是,Jersey Server 似乎无法使用 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主类

@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);
}

我运行主类,并调用 JerseyConfig 类,并且我能够注册过滤器。不幸的是,一旦服务运行,当我向一个端点运行请求时,过滤器将被调用到 setHttpFinagleService方法传递 CommonFinagleService 的空依赖项

我也在使用jersey-spring4依赖关系

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

Spring boot和Spring是2.1.0和5.1.8

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

使用 Grizzly + Jersey 一切都很好。

问候

最佳答案

您需要让 Spring 选择 MyFilter 作为 Bean,

添加到类级别@Component并确保通过组件扫描拾取它(如果有的话)

请注意,@Provider 可能是 redundant here如果你使用Spring DI

关于java - 带依赖注入(inject)的 Spring boot 和 Jersey 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58900077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com