gpt4 book ai didi

java - Jersey & Spring 托管供应商

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:42 25 4
gpt4 key购买 nike

我正在使用 Jersey 2.4.1Spring 3.2.4Jetty 7

我不明白 Jersey 如何注册由 Spring 管理的提供程序。我用 @Provider 注释的类也被注释为 @Component 因为我需要注入(inject)。我将 Jersey 配置为使用这些提供商扫描我的包裹。

这是我配置 Jersey servlet 的方式:

public void createJerseyServlet() {
ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.packages("test.web", "org.glassfish.jersey.server.spring");
resourceConfig.register(LoggingFilter.class);
ServletHolder servletHolder = new ServletHolder(new ServletContainer(resourceConfig));
servletContextHandler.addServlet(servletHolder, "/*");
}

启动时的日志:

INFO - org.glassfish.jersey.server.spring.SpringComponentProvider - Spring context lookup done.
INFO - org.glassfish.jersey.server.spring.SpringComponentProvider - Spring component provider initialized.
INFO - org.glassfish.jersey.server.spring.SpringComponentProvider - Spring managed bean, testResource, registered with HK2.
INFO - org.glassfish.jersey.server.spring.SpringComponentProvider - Spring managed bean, nullPointerExceptionMapper, registered with HK2.
INFO - org.glassfish.jersey.server.spring.SpringComponentProvider - Spring managed bean, filterTest, registered with HK2.
[...]
INFO - org.glassfish.jersey.server.ApplicationHandler - Jersey application initialized.
Root Resource Classes:
org.obiba.jta.web.TestResource
Pre-match Filters:
org.glassfish.jersey.filter.LoggingFilter
Global Response Filters:
org.glassfish.jersey.filter.LoggingFilter
Global Reader Interceptors:
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor
Global Writer Interceptors:
org.glassfish.jersey.filter.LoggingFilter
[...]

我的供应商是通过 Spring 检测到的:Spring managed bean, filterTest, registered with HK2 但它们没有出现在 ApplicationHandler 日志中...并且在我运行应用程序时不使用它们。

我需要手动注册它们:

@Resource
private FilterTest filterTest;

@Resource
private MyExceptionMapper myExceptionMapper;

[...]

resourceConfig.register(filterTest);
resourceConfig.register(myExceptionMapper);

或者甚至更好...作为解决方法 :(

Map<String, Object> providers = applicationContext.getBeansWithAnnotation(Provider.class);
for(Object provider : providers.values()) {
resourceConfig.register(provider);
}

现在它可以工作了(即使它们仍然没有出现在 ApplicationHandler 日志中)但我不明白为什么 Jersey 在扫描包时不自动注册它们并看到这些 bean 是由 Spring 管理...


这是我的组件...

资源

package test.web;

@Transactional
@Component
@Path("/test")
public class TestResource {
@Resource
private MyService myService;

@GET
@Path("/inject")
@Produces(MediaType.TEXT_PLAIN)
public String testInjection() {
return "integrationService: " + integrationService;
}

@GET
@Path("/active")
@Produces(MediaType.TEXT_PLAIN)
public String testActiveTransaction() {
return "isActualTransactionActive: " + TransactionSynchronizationManager.isActualTransactionActive();
}

@GET
@Path("/exception")
@Produces(MediaType.TEXT_PLAIN)
public String testException() {
throw new MyException();
}
}

过滤器

package test.web.cfg;

@Provider
@Component
public class FilterTest implements ContainerRequestFilter {
@Resource
private MyService myService;
[...]
}

异常映射器

package test.web.cfg;

@Provider
@Component
public class MyExceptionMapper implements ExceptionMapper<MyException> {
@Override
public Response toResponse(MyException exception) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("MyException was thrown!").build();
}
}

最后是我的依赖

compile("org.glassfish.jersey.core:jersey-common:2.4.1")
compile("org.glassfish.jersey.core:jersey-server:2.4.1")
compile("org.glassfish.jersey.containers:jersey-container-servlet-core:2.4.1")
compile("org.glassfish.jersey.media:jersey-media-multipart:2.4.1")
compile("org.glassfish.jersey.connectors:jersey-apache-connector:2.4.1")
compile("org.glassfish.jersey.ext:jersey-spring3:2.4.1")

最佳答案

这是一个错误...

包扫描组件注册表不工作:https://java.net/jira/browse/JERSEY-2175

关于java - Jersey & Spring 托管供应商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19962472/

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