J'ai une webapp simple fonctionne bien avec jersey 2.6, jboss 5.0.0. L'approche de déclarer tous mes classe d'injection (services) dans un AbstractBinder n'est pas l'élégance. Je souhaite donc utiliser l'injection CDI pour gérer toute la gestion du cycle de vie du bean. J'ai vu que c'est possible avec @manageBean plutôt que @ScopeResquest. Je l'ai essayé avec cette erreur:utiliser jersey 2.x avec CDI sans déclarer le service dans AbstractBinder
> javax.servlet.ServletException: A MultiException has 3 exceptions.
> They are:
> 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at
> Injectee(requiredType=ServiceExemple,parent=RestService,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,2072559159)
> 2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of fr.xx.xx.rest.RestService errors were
> found
> 3. java.lang.IllegalStateException: Unable to perform operation: resolve on fr.xx.xx.rest.RestService
>
> org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:392)
> org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
> org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
> org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219)
> org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
Ma pom config:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.6</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
</exclusion>
<exclusion>
<artifactId>jaxb-impl</artifactId>
<groupId>com.sun.xml.bind</groupId>
</exclusion>
<exclusion>
<artifactId>jettison</artifactId>
<groupId>org.codehaus.jettison</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>3.1.0.GA</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-bean-validation</artifactId>
<version>${jersey.version}</version>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext.cdi</groupId>
<artifactId>jersey-weld2-se</artifactId>
<version>2.25</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext.cdi</groupId>
<artifactId>jersey-cdi1x</artifactId>
<version>2.25</version>
</dependency>
</dependencies>
<build>
<finalName>RESTfulExample</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
Mon web.xml:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restful Web Application</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- <init-param> -->
<!-- <param-name>jersey.config.server.provider.packages</param-name> -->
<!-- <param-value>fr.xx.xx.rest</param-value> -->
<!-- </init-param> -->
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>fr.xx.xx.ApplicationRest</param-value>
</init-param>
<init-param>
<param-name>jersey.config.beanValidation.disable.validateOnExecutableCheck.server</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jersey.config.beanValidation.enableOutputValidationErrorEntity.server</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
mon chemin d'application de classe:
@ApplicationPath("rest")
public class ApplicationRest extends ResourceConfig {
public ApplicationRest() {
// Register resources and providers using package-scanning.
packages("fr.xx.xx.rest");
packages("org.codehaus.jackson.jaxrs");
register(JacksonFeature.class);
register(org.glassfish.jersey.server.validation.ValidationFeature.class);
// register(new ApplicationBinder()); => don't want use it
Mon classe de service simple:
@Default
public class ServiceExemple {
...
et de finir mes ressources classe:
@Path("/service")
@ManagedBean
public class RestService {
@Inject private ServiceExemple service;
...
J'ai ajouter un bean.xml vide dans mon WEB-INF
Merci pour votre aide
Err JBoss 5.0? Êtes-vous sûr? –
oui Jboss 5.0.0 GA –
Si vous voulez découvrir automatiquement un service, vous pouvez utiliser le générateur hk2-metadata (https://hk2.java.net/2.5.0-b36/inhabitant-generator.html) combiné avec un Populator (https://hk2.java.net/2.5.0-b36/apidocs/org/glassfish/hk2/api/Populator.html). Vous pouvez obtenir le Populator pour un ServiceLocator en obtenant le DynamicConfigurationService (https://hk2.java.net/2.5.0-b36/apidocs/org/glassfish/hk2/api/DynamicConfigurationService.html) que chaque ServiceLocator possède et en utilisant le La méthode getPopulator – jwells131313