2017-04-02 1 views
0

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

+0

Err JBoss 5.0? Êtes-vous sûr? –

+0

oui Jboss 5.0.0 GA –

+0

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

Répondre

0

d'abord ressources injectées (haricots) et la classe Jersey Endpoint (point d'injection) doit être CDI-Aware. Il doit être détectable par CDI. Nous pouvons utiliser bean-discovery-mode = "all" - alors CDI scanne toutes les classes ou bean-discovery-mode = "annoté" et MARK notre classe avec l'annotation PROPER: d'ici: Bean defining annotations. Je préfère @ charge ou @RequestScoped

Ensuite, nous devons utiliser Jersey Extension

<dependency> 
    <groupId>org.glassfish.jersey.ext.cdi</groupId> 
    <artifactId>jersey-cdi1x-servlet</artifactId> 
    <version>{version}</version> 
    <scope>runtime</scope> 
</dependency> 

`

pour se connecter CDI avec mécanisme de découverte HK2. Voici Official oracle Guideline