在相同的根上下文中托管静态内容和JAX-RS服务

我们将多个打包为WAR的Java Web应用程序打包在EAR中。 我们的RESTful服务是使用JAX-RS和特定于版本的WAR构建的。

我们希望为每个特定于版本的WAR添加静态内容,但是对于静态内容和RESTful服务API调用使用根上下文(WAR),以便以下所有URL都可以使用:

{hostname}/v1/swagger.yaml <-- Static Content describing the v1 API {hostname}/v1/orders/{uid} <-- JAX-RS RESTful API (v1) {hostname}/v2/swagger.yaml <-- Static Content describing the v2 API {hostname}/v2/orders/{uid} <-- JAX-RS RESTful API (v2) 

以下部署结构是我们目前拥有的,适用于JAX-RS服务,但不适用于静态内容。 换句话说,这些URL有效:

 {hostname}/v1/orders/{uid} <-- JAX-RS RESTful API (v1) {hostname}/v2/orders/{uid} <-- JAX-RS RESTful API (v2) 

但问题是这些URL无法访问:

 {hostname}/v1/swagger.yaml <-- Static Content describing the v1 API {hostname}/v2/swagger.yaml <-- Static Content describing the v2 API 

问题:我们如何让这些静态URL工作?

这是爆炸的EAR:

 example.ear META-INF application.xml v1.war swagger.yaml WEB-INF web.xml classes ApplicationV1.class OrdersResourceV1.class v2.war swagger.yaml WEB-INF web.xml classes ApplicationV2.class OrdersResourceV2.class 

这是EARs application.xml

   ...   v1.war /v1     v2.war /v2     another.war /    

这是v1和v2 web.xml

   

这是ApplicationV1.java (JAX-RS)实现,请注意URL映射:

 import java.util.HashSet; import java.util.Set; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/") public class ApplicationV1 extends Application { private Set singletons = new HashSet(); public ApplicationV1() { singletons.add(new OrdersResourceV1()); } @Override public Set getSingletons() { return singletons; } } 

这是OrdersResourceV1.java (JAX-RS)实现,请注意URL映射:

 import javax.enterprise.context.RequestScoped; import javax.ws.rs.*; @RequestScoped @Path("/orders") public class OrdersResourceV1 { @GET @Path("/{uid}") @Produces("application/json;charset=UTF-8") public Response getOrder(@PathParam("uid") String orderUid) {  } } 

我知道如果我们将ApplicationV*.java的映射更改为@ApplicationPath("/services") ,静态内容将是可评估的,但URL将如下所示,但我们的目标是不包含任何无关的内容像这样的路径元素。

 {hostname}/v1/swagger.yaml <-- Static Content describing the v1 API {hostname}/v1/services/orders/{uid} <-- JAX-RS RESTful API (v1) {hostname}/v2/swagger.yaml <-- Static Content describing the v2 API {hostname}/v2/services/orders/{uid} <-- JAX-RS RESTful API (v2) 

所以我的问题是,我们如何在WAR( /v1/v2 )的根上下文中获取JAX-RS和静态内容? 是否有不同的方式来映射URL? 或者,如果JAX-RS没有URL的处理程序,是否有允许静态回退的配置选项?

我希望这可以解决JavaEE通用方式,但如果没有,我们在Java8上使用Wildfly 8.1。

所以我找到了一个有效的解决方案(经过测试)。 正如Resteasy文档中所述- RESTEasy作为servletfilter :

将Resteasy作为Servlet运行的缺点是,您不能将.html和.jpeg文件等静态资源放在与JAX-RS服务相同的路径中。 Resteasy允许您作为filter运行。 如果在请求的URL下找不到JAX-RS资源,Resteasy将委托回基本servlet容器来解析URL。

web.xml示例

   Resteasy  org.jboss.resteasy.plugins.server.servlet.FilterDispatcher   javax.ws.rs.Application com.restfully.shop.services.ShoppingApplication    Resteasy /*