除子资源之外的RESTEasy JAX-RS动态调度

时间:2011-07-05 15:10:27

标签: jax-rs resteasy

RESTEasy(JAX-RS)允许通过子资源进行动态调度。例如:

POST /customers/create
{"name":"Smith","country":"jp"}

我们可以使用root资源来处理路径“/ customers”,其方法是使用没有HTTP方法但使用@Path(“/ create”)注释的方法。此方法返回JAX-RS查看的资源以继续处理请求。但是,此资源必须处理“/ customers / create”路径。

我现有的情况是可以创建不同类型的实体:

POST /customers/create
{"name":"Smith"}

POST /locations/create
{"name":"Chicago"}

我想基于请求正文中的附加属性添加创建任何类型实体的功能:

POST /entities/create
{"type":"customer","name":"Smith"}

本质上我想将请求转发到处理“POST / customers / create”的代码。我可以编写为“POST / entities / create”调用的子资源定位器并返回Customer资源,但是JAX-RS无法调度请求,因为Customer资源不处理路径“/ entities / create”。有没有办法在转发请求时将URL更改为/ customers / create?

此时我无法更改API以使“客户”成为“实体”的真正子资源。

2 个答案:

答案 0 :(得分:5)

如果您正在使用实现JAX-RS 2.0的RestEasy 3,那么您可以尝试使用ContainerRequestFilter注释@Provider @PreMatching

在此过滤器中,您可以调用ContainerRequestContext#setRequestUri(URI)方法根据请求的内容更改请求URI,从而转发到/entities/create/customers/create或{{ 1}}。 /locations/create注释意味着在匹配目标资源方法之前将调用过滤器,因此您应该能够执行重定向。

(您甚至可以替换请求的内容,例如: @PreMatching - > {"type":"customer","name":"Smith"}使用{"name":"Smith"}ContainerRequestContext#getInputStream()方法

HTH 泽维尔

答案 1 :(得分:0)

我怀疑在返回子资源之前有一种标准的JAX-RS方式来更改URL。但我可以解决你的问题。

像这样定义Generic Rest Resource:POST /entities/{entityType}。根据路径参数entityType,您可以直接决定可以实例化的子参数(例如,使用静态Map<String, Class<?>>来保存实体路径)