2015-01-03 2 views
1

Я пытаюсь создать приложение 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?

ответ

3

Спецификация JAX-RS требует, чтобы все конечные точки REST должны были находиться в вашем файле WAR. Вам действительно нужен файл EAR?

+0

Я не знал об этом требовании, спасибо. Мне не нужен файл EAR, я просто пытаюсь поэкспериментировать с тем, как создать большое приложение Java EE с несколькими модулями. Итак, если мои конечные точки REST должны быть в WAR-файле, должен ли я помещать своих EJB в эту WAR, или они могут жить в отдельном JAR? – tomahim

+0

Вы можете разместить JAR в папке lib вашей WAR. Вы также можете поместить свои ресурсы для отдыха в JAR в lib вашей WAR. Вы просто не можете поместить их в EJB-JAR в EAR. –

Смежные вопросы