是否可以使用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
注入功能吗?
答案 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节。资源方法最多只能有一个实体参数。