JAX-RS需要一个战争模块吗?

时间:2014-06-13 01:19:00

标签: java-ee ejb jax-rs ear

JAX-RS是否需要网络模块WAR或我做错了什么?

每个教程都声明在web.xml中配置休息服务。 但是在ejb-module中没有web.xml。我必须为休息服务创建一个WAR吗?

在我的ejb模块中,我想将EJB公开为休息服务,但无法使其工作。 调用" localhost:8080 / EjbModule / rest / test / method"导致404

项目结构

- ear
    - EjbModule.jar

代码

将Bean公开为JAX-WS Web服务并在浏览器中进行测试是没有问题的。

@ApplicationPath("rest")
public class RestApplication extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        final Set<Class<?>> classes = new HashSet<>(1);
        classes.add(TestService.class);
        return classes;
    }
}


@Stateless
@Path("/test")
public class TestService
{
    @Path("/method")
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String test()
    {
        return new Date().toString();
    }
}

环境:Glassfish 4.0

修改

创建单独的WAR其他服务按预期工作。

2 个答案:

答案 0 :(得分:6)

来自JAX-RS Specification 2.0 p。 8:

  

2.3.2 Servlet

     

JAX-RS应用程序在.war文件中打包为Web应用程序。应用程序类打包在WEB-INF / classes或   WEB-INF / lib和所需的库打包在WEB-INF / lib中。看到   有关Web打包的完整详细信息的Servlet规范   应用

如果要在Web容器中部署JAX-RS应用程序,这是标准方法。但是,该规范还指出应用程序可以在不同的容器中运行,如ejb-containers甚至Java SE环境。但对于其他容器,没有指定任何内容:

  

实现可以提供在其他类型的容器中托管JAX-RS应用程序的工具,这些工具不在本规范的范围内。

答案 1 :(得分:0)

我知道这是一篇旧文章,但是我用技巧解决了这个问题。

我有很多包含不同EJB的EAR。

例如,EAR_A包括EJB_1和EJB_2,而EAR_B包括EJB_1和EJB_3。

WAR在所有EAR之间共享。我会删除它,但我不能。 我仅将WAR用于javax.ws.rs.core.Application

在此类中,我读取了带有“ rest-resource”的数据库表,并添加了这些类。 每个耳朵第一次将其内容加载到数据库中。

例如,这是异常映射器和过滤器的方法

private void addFilterAndExceptionMappersClasses(Set<Class<?>> resources){
  javax.naming.InitialContext ctx;
  try {
      ctx = new InitialContext();
      RestResourceFacadeRemote rrfr = (RestResourceFacadeRemote) ctx.lookup(this.wsresource);
      if(rrfr == null){
          LOG.log(Level.SEVERE, "{0} is null", "RestResourceFacadeRemote");
      }
      String classe = "no class";
      if (rrfr.getEntityClass()!= null) {
        classe = rrfr.getEntityClass().getClasse();
      }

      List<RestResource> lr = rrfr.getListaPerTipo(RestResourceType.Filter);
      for(RestResource r : lr){
        try{
            Class<?> c = Class.forName(r.getRisorsa());
            resources.add(c);
        }catch(ClassNotFoundException cnfe){
          LOG.log(Level.SEVERE, "Class not found for filter {0}",r.getRisorsa());
        }
      }
      lr = rrfr.getListaPerTipo(RestResourceType.ExceptionMapper);
      for(RestResource r : lr){
        try{
           Class<?> c = Class.forName(r.getRisorsa());
           resources.add(c);
        }catch(ClassNotFoundException cnfe){
          LOG.log(Level.SEVERE, "Classe per exception mapper {0} non trovata!",r.getRisorsa());
        }
      }
  } catch (NamingException ex) {
      LOG.log(Level.SEVERE, "Cannot read context", ex);
  } catch (EJBException ex){
      LOG.log(Level.SEVERE, "EJB exception: ", ex);
  }

}

也许您可以在没有数据库的情况下使用文件来执行相同的操作。您只需要在resources.add(c)中添加一个类名列表即可。

我在每个EAR的application.xml中只包含相同的WAR。