2015-01-03 84 views
1

我嘗試使用Rest服務和EJB注入來構建Java EE 7應用程序。 我創建了一個多模塊Maven項目,我在Glassfish 4.部署我最終EAR包含我的EJB的一個JAR,與例如我的休息服務的定義:作爲@Stateless EJB的JAX-RS服務:NameNotFoundException

@Stateless 
@Path("countries") 
public class CountryRest { 

    //@EJB 
    //StockService stockService; 

    @GET 
    public Response getCountries() { 
     //stockService.getAll(); --> firing a NPE, stockService is Null 
     return Response.ok().build(); 
    } 
} 

@Stateless 
@Remote(IStockService.class) 
public class StockService implements IStockService { 

    @Override 
    public List<Stock> getAllStock() { 
     return new ArrayList<Stock>(); 
    } 
} 

當我部署我的應用程序,我看到下面的日誌似乎沒問題。即使我不知道爲什麼它定義的「java:全球」 JNDI,因爲默認情況下@Stateless EJB是@Local:

Portable JNDI names for EJB CountryRest: [java:global/GeoData-ear/GeoData-ejb-1.0-SNAPSHOT/CountryRest, java:global/GeoData-ear/GeoData-ejb-1.0-SNAPSHOT/CountryRest!com.tomahim.geodata.rest.CountryRest] 
Portable JNDI names for EJB StockService: [java:global/GeoData-ear/GeoData-ejb-1.0-SNAPSHOT/StockService, java:global/GeoData-ear/GeoData-ejb-1.0-SNAPSHOT/StockService!com.tomahim.geodata.services.IStockService] 

後來,當我正在做的事情/ REST /國家GET,狀態爲200如預期但我有一個的NameNotFoundException/NamingException的:

Avertissement: An instance of EJB class, com.tomahim.geodata.rest.CountryRest, could not be looked up using simple form name. Attempting to look up using the fully-qualified form name. 
javax.naming.NamingException: Lookup failed for 'java:module/CountryRest' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: No object bound to name java:module/CountryRest] 

我看到,對於查找的「java:模塊/ ContryRest」不匹配「的java:全球/.../ CountryRest」但我究竟做錯了什麼?

編輯1:我能夠通過將我的Rest定義和EJB放置在我的webapp maven模塊中部署爲WAR來使@Ejb注入工作。所以看來只有當我在一個JAR中部署我的EJB時纔會出現問題。任何想法 ? JAR和WAR部署之間有什麼區別?

回答

3

JAX-RS規範要求所有REST端點必須存在於您的WAR文件中。你真的需要一個EAR文件嗎?

+0

我不知道這個要求,謝謝。我並不真的需要一個EAR文件,我只是試着嘗試如何構建一個包含多個模塊的大型Java EE應用程序。因此,如果我的REST端點需要位於WAR文件中,我應該將其他EJB放入此WAR嗎?還是可以將它們放在單獨的JAR中? – tomahim

+0

您可以將JAR放入WAR的lib文件夾中。您也可以將您的其餘資源放在WAR的lib中的JAR中。您不能將它們作爲EJB-JAR放入EAR中。 –

相關問題