在实现中设置JAX-RS响应标头,而无需在接口中暴露HttpServletResponse

Gar*_*son 4 java rest jax-rs httpresponse

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

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

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

  @GET
  public Bar getBar(@PathParam(value = "{id}") int id) {
Run Code Online (Sandbox Code Playgroud)

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

  public Bar getBar(@PathParam(value = "{id}") int id, @Context HttpServletResponse servletResponse) {
Run Code Online (Sandbox Code Playgroud)

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

我的RESTful资源服务实现如何设置HTTP响应标头而不在资源接口中引入依赖关系?

我看到一篇推荐我将HttpServletResponse作为类成员注入的帖子。但是,如果我的资源服务实现是单例的,这将如何工作?它是否使用某种具有线程局部变量的代理,或者即使多个线程同时使用singleton类,也能找出正确的servlet响应的代理?还有其他解决方案吗?

Gar*_*son 5

正确的答案似乎是HttpServletResponse在实现的成员变量中注入,正如我指出的另一篇文章所指出的那样。

@Context  //injected response proxy supporting multiple threads
private HttpServletResponse servletResponse;
Run Code Online (Sandbox Code Playgroud)

即使peeskillet指出Jersey的半官方列表未列出HttpServletResponse为可代理类型之一,但当我跟踪代码时,至少RESTEasy似乎正在创建代理(org.jboss.resteasy.core.ContextParameterInjector$GenericDelegatingProxy@xxxxxxxx)。据我所知,似乎正在发生单例成员变量的线程安全注入。

另请参阅/sf/answers/705342921/