[英]Jersey & Spring managed providers
我正在使用Jersey 2.4.1 , Spring 3.2.4和Jetty 7 。
我不明白Jersey如何注冊由Spring管理的提供商。 我用@Provider
注釋的@Component
也注釋了@Component
因為我需要注入。 我將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.