RESTEasy(JAX-RS)允许通过子资源进行动态调度.例如:
POST /customers/create
{"name":"Smith","country":"jp"}
Run Code Online (Sandbox Code Playgroud)
我们可以使用根资源来处理路径"/ customers",其方法是使用没有HTTP方法但使用@Path("/ create")注释的方法.此方法返回JAX-RS查看的资源以继续处理请求.但是,此资源必须处理"/ customers/create"路径.
我有一个现有的情况,可以创建不同类型的实体:
POST /customers/create
{"name":"Smith"}
POST /locations/create
{"name":"Chicago"}
Run Code Online (Sandbox Code Playgroud)
我想基于请求正文中的附加属性添加创建任何类型实体的功能:
POST /entities/create
{"type":"customer","name":"Smith"}
Run Code Online (Sandbox Code Playgroud)
本质上,我想将请求转发到处理"POST/customers/create"的代码.我可以编写为"POST/entities/create"调用的子资源定位器并返回Customer资源,但是JAX-RS无法调度请求,因为Customer资源不处理路径"/ entities/create".有没有办法在转发请求时将URL更改为/ customers/create?
此时我无法更改API以使"客户"成为"实体"的真正子资源.
如果您正在使用实现JAX-RS 2.0的RestEasy 3,那么您可以尝试使用带ContainerRequestFilter注释的@Provider @PreMatching.
在此过滤器中,您可以调用ContainerRequestContext#setRequestUri(URI)方法根据请求的内容更改请求URI,从而转发/entities/create到/customers/create或/locations/create.该@PreMatching注解意味着该过滤器将被调用之前的目标资源的方法是匹配的,所以这是你应该能够执行重定向.
(您甚至可以替换请求的内容,例如:
{"type":"customer","name":"Smith"}- > {"name":"Smith"}使用ContainerRequestContext#getInputStream()和ContainerRequestContext#setInputStream(InputStream)方法)
HTH Xavier
| 归档时间: |
|
| 查看次数: |
1292 次 |
| 最近记录: |