gpt4 book ai didi

jax-rs - RESTEasy JAX-RS 动态调度(子资源除外)

转载 作者:行者123 更新时间:2023-11-30 23:47:11 28 4
gpt4 key购买 nike

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

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

我们可以有一个根资源来处理路径“/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 无法分派(dispatch)请求,因为 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)方法)

高温高压
泽维尔

关于jax-rs - RESTEasy JAX-RS 动态调度(子资源除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6584925/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com