【问题标题】:Can JAX-RS construct an object using only @*Param annotations?JAX-RS 可以仅使用 @*Param 注释构造对象吗?
【发布时间】:2014-05-22 17:05:36
【问题描述】:

是否可以让 JAX-RS 实现如 RESTEasy 自动构造一个只包含 @*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 注入功能?

【问题讨论】:

    标签: java jax-rs resteasy


    【解决方案1】:

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

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

    【讨论】:

    • RESTEasy 文档中似乎仍然省略了这一点,但推测它是受支持的。谢谢!
    【解决方案2】:

    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 节。资源方法最多只能有一个实体参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      相关资源
      最近更新 更多