gpt4 book ai didi

java - 在不在接口(interface)中公开 HttpServletResponse 的情况下在实现中设置 JAX-RS 响应 header

转载 作者:搜寻专家 更新时间:2023-11-01 02:24:46 24 4
gpt4 key购买 nike

我有一个 RESTful 服务器实现以及一个供客户端进行调用的库,所有这些都使用 JAX-RS。服务器组件分为接口(interface) FooResource 和实现 FooResourceService

为了让客户端和服务器库共享 RESTful 路径和其他定义,我想将 FooResource 接口(interface)拆分到它自己的项目中:

@Path(value = "foo")
public interface FooResource {

@GET
public Bar getBar(@PathParam(value = "{id}") int id) {

我想在响应中设置一些标题。一种简单的方法是在方法签名中使用 @Context HttpServletResponse:

  public Bar getBar(@PathParam(value = "{id}") int id, @Context HttpServletResponse servletResponse) {

但问题是这暴露了接口(interface)中的实现细节。更具体地说,它突然需要我的 REST 定义项目(在客户端和服务器库之间共享)来引入 javax.servlet-api 依赖项——客户端不需要(或的愿望)。

我的 RESTful 资源服务实现如何设置 HTTP 响应 header 而不引入资源接口(interface)中的依赖项?

我看到了one post建议我将 HttpServletResponse 作为类成员注入(inject)。但是,如果我的资源服务实现是单例,这将如何工作?它是否使用某种带有线程局部变量的代理,或者即使多个线程同时使用单例类也能计算出正确的 servlet 响应的东西?还有其他解决方案吗?

最佳答案

正确的答案似乎是在实现的成员变量中注入(inject)一个HttpServletResponse,正如我注意到的another post已经指出。

@Context  //injected response proxy supporting multiple threads
private HttpServletResponse servletResponse;

尽管 peeskillet 表示 Jersey 的半官方列表没有将 HttpServletResponse 列为可代理类型之一,但当我通过代码进行追踪时,至少 RESTEasy 似乎正在创建一个代理(org.jboss.resteasy.core.ContextParameterInjector$GenericDelegatingProxy@xxxxxxxx)。据我所知,单例成员变量的线程安全注入(inject)似乎正在发生。

另见 https://stackoverflow.com/a/10076327/421049 .

关于java - 在不在接口(interface)中公开 HttpServletResponse 的情况下在实现中设置 JAX-RS 响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647668/

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