4

私はJersey 2.4.1Spring 3.2.4、およびJetty 7を使用しています。

Spring が管理するプロバイダを Jersey が登録する方法がわかりません。インジェクションが必要なため、アノテーションが付けられたクラス@Providerにもアノテーションが付けられます。@Componentこれらのプロバイダーでパッケージをスキャンするように Jersey を構成しました。

以下は、Jersey サーブレットの構成方法です。

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

1 に答える 1

3

それはバグです...

パッケージ スキャン コンポーネント レジストリが機能しない: https://java.net/jira/browse/JERSEY-2175

于 2013-11-14T19:32:11.330 に答える