Jersey / JaxRs包装任何回复

时间:2014-08-17 15:44:28

标签: jaxb jax-ws jax-rs jersey-2.0

我正在寻找一种方法来包装我服务的任何回复。

我有一个简单的服务,有很多不同的方法,比如

@Path(value = "/listSomething/{apiKey:.+}")
public List<ObjectA> listSomething(@PathParam(value = "apiKey") String apiKey)

一些返回列表,有些只是一些普通对象。我现在想要实现的是用一些状态信息(例如下面的内容)包围它们周围的任何响应。

response {
   staus: "OK",
   data: {..the actual response..}
}

我试图通过一些拦截器实现这一点,但我没有成功(除非我添加@XmlSeeAlso注释,我真的不想要的,因为我喜欢一些通用的方法)。我的包装类看起来像:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
//@XmlSeeAlso(ResponseA.class)
public class ResponseWrapper {

  boolean error;
  String message;
  @XmlAnyElement(lax = true)
  Object object;

  public boolean isError() {
      return error;
  }

  public void setError(boolean error) {
      this.error = error;
  }

  public String getMessage() {
      return message;
  }
}

我尝试了@XmlElement,@ XmlAnyElement的不同组合 - 没有任何成功。我在WriterInterceptor和ContainerResponseFilter中尝试过它。

我怎么能做这个简单的伎俩(如果我不关心消费者是否想要XML或JSON,那将会很酷,但如果我不得不为JSON攻击某些东西,那我就可以了。 )?

我此刻感到有点迷茫。谢谢你的帮助。

我尝试的方法通常得到的错误是UNKOWN_CLASS

   {0} nor any of its super class is known to this context.

我的拦截器或多或少地做了这个

  responseContext.setGenericType(Wrapper.class);
  responseContext.setType(Wrapper.class);
  responseContext.setEntity(wrapperInstance);

1 个答案:

答案 0 :(得分:0)

我在拦截器中想到的最简单的方法是:

Object currentEntity = responseContext.getEntity();
ResponseWrapper wrapper = new ResponseWrapper(currentEntity);
responseContext.setEntity(wrapper);