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以使“客户”成为“实体”的真正子资源。
答案 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<?>>
来保存实体路径)