我嘗試使用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部署之間有什麼區別?
我不知道這個要求,謝謝。我並不真的需要一個EAR文件,我只是試着嘗試如何構建一個包含多個模塊的大型Java EE應用程序。因此,如果我的REST端點需要位於WAR文件中,我應該將其他EJB放入此WAR嗎?還是可以將它們放在單獨的JAR中? – tomahim
您可以將JAR放入WAR的lib文件夾中。您也可以將您的其餘資源放在WAR的lib中的JAR中。您不能將它們作爲EJB-JAR放入EAR中。 –