作为@Stateless EJB的JAX-RS服务:NameNotFoundException

时间:2015-01-03 03:50:24

标签: rest glassfish jax-rs ejb-3.0

我尝试使用Rest服务和EJB注入构建Java EE 7应用程序。 我创建了一个我在Glassfish 4上部署的多模块maven项目。我的最终EAR包含一个带有EJB的JAR,例如我的Rest服务定义:

@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:global”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 / countries上进行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:module / ContryRest”的查找与“java:global /.../ CountryRest”不匹配,但我做错了什么?

编辑1:我能够通过将我的静态定义和EJB放在我的webapp maven模块中作为WAR来进行@Ejb注入工作。所以似乎只有在我在EJB中部署EJB时才会出现问题。任何的想法 ? JAR和WAR部署之间可能有什么区别?

1 个答案:

答案 0 :(得分:3)

JAX-RS规范要求所有REST端点必须存在于WAR文件中。你真的需要一个EAR文件吗?