简体   繁体   English

Jersey&Spring管理提供商

[英]Jersey & Spring managed providers

I'm using Jersey 2.4.1 , Spring 3.2.4 and Jetty 7 . 我正在使用Jersey 2.4.1Spring 3.2.4Jetty 7

I don't understand how Jersey registers providers that are managed by Spring. 我不明白Jersey如何注册由Spring管理的提供商。 My classes annotated with @Provider are also annotated @Component because I need injection. 我用@Provider注释的@Component也注释了@Component因为我需要注入。 I configured Jersey to scan my packages with these providers. 我将Jersey配置为使用这些提供程序扫描我的包。

Here is how I configure Jersey servlet: 以下是我配置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, "/*");
}

The logs at startup: 启动时的日志:

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
[...]

My providers are detected via Spring: Spring managed bean, filterTest, registered with HK2 but they don't appear in the ApplicationHandler logs... And they are not used when I run the application. 我的提供程序是通过Spring检测到的: Spring managed bean, filterTest, registered with HK2但它们没有出现在ApplicationHandler日志中......并且在运行应用程序时它们不会被使用。

I need to manually register them: 我需要手动注册它们:

@Resource
private FilterTest filterTest;

@Resource
private MyExceptionMapper myExceptionMapper;

[...]

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

Or even better... for a workaround :( 甚至更好......解决方法:(

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

Now it works (even if they still don't appear in ApplicationHandler logs) but I don't understand why Jersey does not register them automatically when it scans the package and see that these bean are managed by Spring... 现在它可以工作(即使它们仍然没有出现在ApplicationHandler日志中)但是我不明白为什么Jersey在扫描包时没有自动注册它们并且看到这些bean是由Spring管理的...


Here are my components... 这是我的组件......

Resource 资源

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

Filter 过滤

package test.web.cfg;

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

ExceptionMapper ExceptionMapper

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

And finally my dependencies 最后我的依赖

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")

It's a bug... 这是一个错误......

Package scanning component registry not working: https://java.net/jira/browse/JERSEY-2175 包扫描组件注册表无法正常工作: https//java.net/jira/browse/JERSEY-2175

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

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