pet*_*erl 5 java jax-rs java-ee resteasy wildfly-8
我们将多个打包为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)
Run Code Online (Sandbox Code Playgroud)
以下部署结构是我们目前拥有的,适用于JAX-RS服务,但不适用于静态内容.换句话说,这些URL有效:
{hostname}/v1/orders/{uid} <-- JAX-RS RESTful API (v1)
{hostname}/v2/orders/{uid} <-- JAX-RS RESTful API (v2)
Run Code Online (Sandbox Code Playgroud)
但问题是这些URL无法访问:
{hostname}/v1/swagger.yaml <-- Static Content describing the v1 API
{hostname}/v2/swagger.yaml <-- Static Content describing the v2 API
Run Code Online (Sandbox Code Playgroud)
问题:我们如何让这些静态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
Run Code Online (Sandbox Code Playgroud)
这是EAR application.xml:
<?xml version="1.0"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6">
<application-name>...</application-name>
<module>
<web>
<web-uri>v1.war</web-uri>
<context-root>/v1</context-root>
</web>
</module>
<module>
<web>
<web-uri>v2.war</web-uri>
<context-root>/v2</context-root>
</web>
</module>
<module>
<web>
<web-uri>another.war</web-uri>
<context-root>/</context-root>
</web>
</module>
</application>
Run Code Online (Sandbox Code Playgroud)
这是v1和v2 web.xml:
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
</web-app>
Run Code Online (Sandbox Code Playgroud)
这是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<Object> singletons = new HashSet<Object>();
public ApplicationV1() {
singletons.add(new OrdersResourceV1());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
Run Code Online (Sandbox Code Playgroud)
这是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) {
<ommited for brevity>
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如果我们改变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)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我们如何在WAR(/v1和/v2)的根上下文中获取JAX-RS和静态内容?是否有不同的方式来映射URL?或者,如果JAX-RS没有URL的处理程序,是否有允许静态回退的配置选项?
我希望这可以解决JavaEE通用方式,但如果没有,我们在Java8上使用Wildfly 8.1.
| 归档时间: |
|
| 查看次数: |
3080 次 |
| 最近记录: |