如何构建代理请求和响应的 JAX RS 资源? -- 也就是说,我可以转发请求和响应正文,可能会更改标头等次要细节
已尝试在资源定义中向客户端转发请求/从客户端转发请求,但这不允许我混合服务器发送的事件和常规响应,并且很难知道使用 JAX RS 重新编码时响应是否发生变化。
JAX-RS 允许使用过滤器来记录、更改和验证传入请求和传出响应,如其规范第 6 章所述。 如果需要更改传入请求,则必须有一个实现
@Provider
接口的
ContainerRequestFilter
,然后将此过滤器绑定到给定的休息端点。假设您必须更改传入请求标头。你应该实现这样的事情:
@jakarta.ws.rs.ext.Provider
public class IncomingFilter implements jakarta.ws.rs.container.ContainerRequestFilter {
public void filter(ContainerRequestContext ctx) throws IOException {
fixHeaders(ctx);
}
private void fixHeaders(ContainerRequestContext ctx) {
// Do your thing
}
}
如果您必须将过滤器应用于每个请求,则应该这样做。如果您只需申请某些剩余端点,则必须像 CDI 一样使用名称绑定来理想地绑定它。创建名称绑定注释,例如:
@NameBinding
@Target({ElementType.TYPE, ElementType.Method})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface HeaderAdjusted {}
使用名称绑定注释提供者和端点,然后就可以开始了:
@Provider
@HeaderAdjusted
public class IncomingFilter (...)
@Path("/")
public class MyEndpointClass {
@HeaderAdjusted
@GET
@Produces("text/plain")
@Path("hi")
public String hi() {
return myFixedHeaderInformationFromContext();
}
}
请阅读规范中的整个第 6 章以获取更多信息。