Я пытаюсь объединить RESTEasy с Weld на AppEngine, но с трудностями делать инъекцию конструктора.CDI/Weld не удалось выполнить инсталляцию конструктора ресурса RESTEasy
Я добавил параметр контекста RESTEasy CdiInjectorFactory и прослушиватель сервлетов Weld.
Мой класс приложения Resteasy выглядит следующим образом:
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> classes = new HashSet<Class<?>>();
classes.add(CustomerResource.class);
return classes;
}
}
и CustomerResource:
@Path("/rest/app/customers")
public class CustomerResource {
private final CustomerService customerService;
@Inject
public CustomerResource(CustomerService customerService) {
this.customerService = customerService;
}
..
}
CustomerService является простой сервис, как:
public class CustomerService {
public List<Customer> getCustomers() {
..
}
}
Когда я запустить сервер Я вижу в журнале:
[INFO] 2014-01-30 21:34:53 INFO org.jboss.weld.Version:146 - WELD-000900: 2.1.2 (Final)
[INFO] 2014-01-30 21:34:53 WARN org.jboss.weld.environment.servlet.Listener:137 - @Resource injection not available in simple beans
[INFO] 2014-01-30 21:34:54 INFO org.jboss.weld.Bootstrap:199 - WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
[INFO] 2014-01-30 21:34:55 DEBUG org.jboss.resteasy.cdi.ResteasyCdiExtension:68 - Discovered CDI bean which is javax.ws.rs.core.Application subclass com.mycomp.config.MyApplication.
[INFO] 2014-01-30 21:34:55 DEBUG org.jboss.resteasy.cdi.ResteasyCdiExtension:68 - Bean class com.mycomp.config.MyApplication does not have the scope defined. Binding to @javax.enterprise.context.ApplicationScoped().
[INFO] 2014-01-30 21:34:55 DEBUG org.jboss.resteasy.cdi.ResteasyCdiExtension:68 - Discovered CDI bean which is a JAX-RS resource com.mycomp.rest.app.CustomerResource.
[INFO] 2014-01-30 21:34:55 DEBUG org.jboss.resteasy.cdi.ResteasyCdiExtension:68 - Bean class com.mycomp.rest.app.CustomerResource does not have the scope defined. Binding to @javax.enterprise.context.RequestScoped().
[INFO] 2014-01-30 21:34:55 INFO org.jboss.weld.environment.servlet.Listener:147 - No supported servlet container detected, CDI injection will NOT be available in Servlets, Filters or Listeners
[INFO] 2014-01-30 21:34:56 WARN org.jboss.weld.Interceptor:47 - WELD-001700: Interceptor annotation class javax.ejb.PostActivate not found, interception based on it is not enabled
[INFO] 2014-01-30 21:34:56 WARN org.jboss.weld.Interceptor:47 - WELD-001700: Interceptor annotation class javax.ejb.PrePassivate not found, interception based on it is not enabled
Из этого журнала я вижу, что обнаружено мое приложение RESTEasy и класс ресурсов. Обратите внимание, что я не вижу упоминания о CustomerService.
Когда я получить доступ к своему ресурсу в браузере я получаю:
[INFO] 2014-01-30 21:47:26 DEBUG org.jboss.resteasy.cdi.CdiInjectorFactory:68 - Using CdiConstructorInjector for class class com.mycomp.config.MyApplication.
[INFO] 2014-01-30 21:47:26 DEBUG org.jboss.resteasy.cdi.CdiConstructorInjector:68 - Beans found for class com.mycomp.config.MyApplication : [Managed Bean [class com.mycomp.config.MyApplication] with qualifiers [@Any @Default]]
[INFO] 2014-01-30 21:47:26 INFO org.jboss.resteasy.spi.ResteasyDeployment:82 - Deploying javax.ws.rs.core.Application: class com.mycomp.config.MyApplication$Proxy$_$$_WeldClientProxy
[INFO] 2014-01-30 21:47:26 INFO org.jboss.resteasy.spi.ResteasyDeployment:82 - Adding class resource com.mycomp.rest.app.CustomerResource from Application class com.mycomp.config.MyApplication$Proxy$_$$_WeldClientProxy
[INFO] 2014-01-30 21:47:26 INFO org.jboss.resteasy.spi.ResteasyDeployment:82 - Adding class resource com.mycomp.rest.HeartbeatResource from Application class com.mycomp.config.MyApplication$Proxy$_$$_WeldClientProxy
[INFO] Jan 30, 2014 9:47:26 PM com.google.appengine.tools.development.ApiProxyLocalImpl log
[INFO] SEVERE: javax.servlet.ServletContext log: unavailable
[INFO] java.lang.RuntimeException: Could not find constructor for class: com.mycomp.rest.app.CustomerResource
ли Resteasy пытается создать новый экземпляр CustomerResource и не выбирая его из сварного шва?
Я также пробовал с инъекцией поля (вместо инъекции конструктора), а затем я вижу, что CustomerService красиво вводится в CustomerResource.
Я предпочитаю только инъекцию конструктора и интересно, поддерживается ли это в классах ресурсов RESTEasy при использовании Weld?