JAX-RS可以仅使用@ * Param注释构造一个对象吗?

时间:2014-05-22 17:05:37

标签: java jax-rs resteasy

是否可以使用RESTEasy等JAX-RS实现来自动构建仅包含@*Param注释的对象,例如@MatrixParam?我有以下代表分页的类:

public class Pagination {
    @MatrixParam("after")  public String afterKey;
    @MatrixParam("from")   public String fromKey;
    @MatrixParam("to")     public String toKey;
    @MatrixParam("before") public String beforeKey;
    @MatrixParam("count")  public int count;
}

我想将它传递给JAX-RS方法,例如:

@GET
@Produces("text/html")
Response asHtml(Pagination pagination);

我希望RESTEasy会调用默认的构造函数,然后注入字段值,但是我得到了一个"找不到邮件正文阅读器"错误。显然,没有消息体,添加虚拟String构造函数没有帮助。我需要为此创建自己的@Provider吗?如果是这样的话,这样的事情可以变得通用并利用内置的@*Param注入功能吗?

2 个答案:

答案 0 :(得分:1)

我知道这是一个很老的主题,但是JAX-RS 2.0有@BeanParam注释可以做到这一点。

@GET
@Produces("text/html")
Response asHtml(@BeanParam Pagination pagination);

答案 1 :(得分:0)

answer到类似的question,还有一个特定于RESTEasy的注释@Form,允许这样做:

  

这是一个RESTEasy特定注释,允许您在注入的类中重用任何@*Param注释。 RESTEasy将实例化类并将值注入任何带注释的@*Param@Context属性。如果您的方法上有很多参数,并且希望将它们压缩为值对象,那么这非常有用。

@Form注释位于资源方法参数或资源字段,而不是值对象类:

@GET
@Produces("text/html")
Response asHtml(@Form Pagination pagination);

其他实现可能需要实体提供者。来自JAX-RS规范(JSR-339):

  

3.3.2.1实体参数
  未使用@FormParam注释的参数或第3.2节中列出的任何注释(称为实体参数)的值从请求实体主体映射。实体主体和Java类型之间的转换是实体提供者的责任,请参见第4.2节。资源方法最多只能有一个实体参数。