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

标签 java rest jax-rs httpresponse

我有一个 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/

相关文章:

java - 在 JPA/Hibernate 中删除然后查询失败(已删除的实体传递到持久化)

java - 打印一些其他字符

javascript - 如何向最终用户隐藏 REST API Url?

java - 使用 Java 以编程方式重写 URL

java - Pdf Renderer API Android 来自 URL

java - 如何通过Java运行或访问linux系统目录

javascript - REST API 删除请求和更新分页

python - 谷歌云自然语言 API 的参数

java.lang.NoSuchMethodError : org. eclipse.persistence.oxm.XMLUnmarshaller.setNamespaceResolver(Lorg/eclipse/persistence/oxm/NamespaceResolver;)

java - 向 OSGi JAX-RS 资源添加方面