Я пытаюсь создать приложение Java EE 7 с сервисами Rest и EJB injection. Я создал Maven многолетний проект модуля, который я разворачивать на Glassfish 4. Мой последний EAR содержит JAR с моим EJBs, с, например моих определений Отдых услуг:Служба JAX-RS как @Stateless EJB: 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]
Тогда, когда я делаю 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», но что я делаю неправильно?
EDIT 1: Я смог сделать работу по инъекции @Ejb, поставив определения моего отдыха и EJB в моем модуле webapp maven как WAR. Таким образом, кажется, что проблема возникает только тогда, когда я развертываю EJB в JAR. Есть идеи ? В чем разница между развертыванием JAR и WAR?
Я не знал об этом требовании, спасибо. Мне не нужен файл EAR, я просто пытаюсь поэкспериментировать с тем, как создать большое приложение Java EE с несколькими модулями. Итак, если мои конечные точки REST должны быть в WAR-файле, должен ли я помещать своих EJB в эту WAR, или они могут жить в отдельном JAR? – tomahim
Вы можете разместить JAR в папке lib вашей WAR. Вы также можете поместить свои ресурсы для отдыха в JAR в lib вашей WAR. Вы просто не можете поместить их в EJB-JAR в EAR. –