2017-08-07 1 views
0

Je fais une application de service de repos avec JAX-RS. C'est pour un projet pour l'école. Pour ce projet, je dois utiliser des techniques suivantes: • Maven • JAX-RS • CDI • JPA - EJB • JNDI • Bean ValidationLe service de repos ne fonctionnera pas avec CDI: Service reste nul

Alors maintenant, je l'ai déjà maded mon domaine "Cafés" avec un faux DB ("CafeStub") et une vraie DB en utilisant JPA ("CafeDB"). Mon domaine fait aussi un peu usage de CDI. (@Inject dans la classe CafeService ...)

Non Je voulais créer mon service de repos, en utilisant JAX-RS. Cela a bien fonctionné: enter image description here

Mon problème est quand j'essaie d'utiliser CDI à nouveau il échoue et donne une 500 exception, NullPointerException, « grave: Le RuntimeException ne pouvait pas être mis en correspondance avec une réponse, re-jeter à la HTTP récipient » pleine Stacktrace: enter image description here

Je ne sais pas comment résoudre ce problème, recherche déjà depuis longtemps .. Espérons que quelqu'un peut me aider: s

Ceci est ma « classe CafeController ». La production du service de repos

Path("/cafes") 
public class CafeController { 

@Inject 
private CafeFacade cafeFacade; 

public CafeController() { 
    //this.cafeFacade = new CafeService(); 
} 

@GET 
@Produces("application/json") 
public Response getCafes(){ 
    try{ 
     // test ........ 
     ObjectMapper mapper = new ObjectMapper(); 
     Cafe cafe = cafeFacade.getCafe(new Long(1)); 
     String jsonInString = mapper.writeValueAsString(cafe); 
     return Response.status(200).entity(jsonInString).build(); 
    }catch (JsonProcessingException jsonEx) { 
     System.out.println("Json Exception"); 
     System.out.println(jsonEx.getMessage()); 
     return null; 
    } 
} 

Celui-ci est le « CafeService » classe, celui qui a mis en œuvre « CafeFacade »

public class CafeService implements CafeFacade { 

@Inject 
private CafeRepository cafeRepository; 

public CafeService() { 
    //cafeRepository = new CafeStub(); 
    //cafeRepository = new CafeDB("CafesPU"); 
} 

@Override 
public long addCafe(Cafe cafe) { 
    return this.cafeRepository.addCafe(cafe); 
} 

@Override 
public Cafe getCafe(long cafeID) { 
    return this.cafeRepository.getCafe(cafeID); 
} 

Elle vous voyez la classe « CafeStub », celui qui a mis en œuvre « CafeRepository »

public class CafeStub implements CafeRepository { 

private static Map<Long, Cafe> cafes; 
private static long counter = 0; 

public CafeStub() { 
    cafes = new HashMap<Long, Cafe>(); 

    // adding some dara 
    this.addSomeData(); 
}  

@Override 
public long addCafe(Cafe cafe) { 
    if(cafe == null){ 
     throw new DBException("No cafe given"); 
    } 
    counter++; 
    cafe.setCafeID(counter); 
    cafes.put(cafe.getCafeID(), cafe); 
    return cafe.getCafeID(); 
} 

@Override 
public Cafe getCafe(long cafeID) { 
    if(cafeID < 0){ 
     throw new DBException("No correct cafeID given"); 
    } 
    if(!cafes.containsKey(cafeID)){ 
     throw new DBException("No cafe was found"); 
    } 
    return cafes.get(cafeID); 
} 

Au moins ici, vous pouvez voir mon pom.xml (dépendances du projet CafeService) - web.xml (projet de CafeService) et de la structure du projet ...

<dependencies> 
    <dependency> 
     <groupId>Cafes</groupId> 
     <artifactId>Cafes</artifactId> 
     <version>0.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.3</version> 
     <type>jar</type> 
    </dependency> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>7.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>asm</groupId> 
     <artifactId>asm</artifactId> 
     <version>3.3.1</version> 
    </dependency>  
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-bundle</artifactId> 
     <version>1.19.4</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>1.19.4</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-core</artifactId> 
     <version>1.19.4</version> 
    </dependency> 
</dependencies> 

enter image description here

enter image description here

Merci à l'avance ... Vive Tom

Répondre

1

Une classe annotée avec simplement @Path ne marque pas la classe en tant que bean CDI car elle ne figure pas dans la liste des annotations définissant le bean dans la spécification CDI. L'ajout de RequestScoped au service REST le marque comme un bean CDI afin que l'injection fonctionne comme vous l'avez découvert.

Cette réponse répertorie les annotations qui marquent une classe en tant que bean CDI. Is @javax.annotation.ManagedBean a CDI bean defining annotation?

0

.. Résolu RequestScoped fait le tour .. Daimn cherché si longtemps pour une annotation.

@RequestScoped 
@Path("/cafes") 
public class CafeController { 

Je ne comprends toujours pas pourquoi je dois l'utiliser. @RequestScoped: CDI instancie et gère le bean -> Je pensais que mon bean.xml aurait instancié et géré le bean?