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
其他服务按预期工作。
答案 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。