2017-08-07 9 views
0

JAX-RSでレストサービスアプリケーションを作成しています。それは学校のためのいくつかのプロジェクトのためです。このプロジェクトのために私は技術に従う使用する必要があります。 •Mavenを •JAX-RS •CDI •JPA - EJB •JNDI •ビーン検証だから今、私はすでにフェイクで自分のドメイン "カフェ" をmadedCDIを使用している場合、レストサービスは動作しません。サービスはnullのままです

DB(「CafeStub」)とJPA(「CafeDB」)を使用した実際のDBとの間に存在する。私のドメインではCDIを少し使います。 (CafeServiceクラスの@Inject ...)

私はJAX-RSを使用して休憩サービスを作成したかったのです。これがうまく働いた: enter image description here

を私は再びCDIを使用しようとすると私の問題は、それが失敗していると、それは重度の500例外、NullPointerExceptionが、「与える:RuntimeExceptionは、HTTPに再投げ、応答にマッピングすることができませんでしたコンテナ」 のフルスタックトレース: enter image description here

私は長い時間を検索すでに、この問題を解決する方法がわからない...うまくいけば、誰かが私を助けることができます。■

これが私です 『CafeController』クラス。

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; 
    } 
} 

この1つは、「CafeService」クラスであるRESTサービス、「CafeFacade」彼女はあなたが「CafeStub」クラスを参照してください

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); 
} 

、「CafeRepository」を実装1を実装1を生成します

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); 
} 

少なくとも、ここにあなたが私のpom.xmlを見ることができます(CafeServiceプロジェクトから依存関係) - (CafeServiceプロジェクトから)web.xmlおよびプロジェクトの構造...

事前に
<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

おかげで... 乾杯解決 トム

答えて

1

@Pathだけで注釈付けされたクラスは、CDI仕様の注釈を定義するBeanのリストにないため、クラスをCDI Beanとしてマークしません。 RequestScopedをRESTサービスに追加すると、CDI Beanとしてマークされます。これにより、発見したようにインジェクションが動作します。

この回答は、クラスをCDI Beanとしてマークする注釈をリストしています。 Is @javax.annotation.ManagedBean a CDI bean defining annotation?

0

.. RequestScopedはDaimnは1つの注釈に限り、検索..トリックをしました。

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

なぜ私はそれを使用する必要があるのか​​分かりません。 @RequestScoped:CDIはBeanをインスタンス化して管理します - >私のbean.xmlがインスタンス化してBeanを管理すると思いましたか?

関連する問題