我使用Jersey 2.19来实现REST API。
我使用内置约束和用户定义约束注释了我的资源。
@Path("myPath")
public class MyResource
{
@NotEmpty
@AssertBoolean
@FormParam("my-param")
private String m_myParam;
@POST
@Produces(MediaType.TEXT_PLAIN)
@Consumes("application/x-www-form-urlencoded")
public Response test(String body) throws Exception
{
...
}
}
我的用户定义约束@AssertBoolean
会检查参数的值是true
还是false
。
当我提交POST
请求而未提供my-param
的值时,我在@AssertBoolean
的验证程序中收到异常,因为参数的值为null
。这意味着它在@AssertBoolean
之前验证@NotEmpty
。
我可以强制验证订单吗?或者我必须在验证器中检查null
吗?
答案 0 :(得分:2)
这实际上是一个关于Bean Validation约束排序的问题,因为JAX-RS依赖于Bean Validation规范,而Jersey依赖于hibernate-validator提供的实现。
要按顺序评估约束注释,需要java.lang.reflect.Field允许以其声明顺序检索注释。实际行为似乎是not reliable。
然后看一下这个stackoverflow answer:它说明目前不支持显式排序bean验证约束,并链接到允许这样做的提案。
要考虑的另一点是,当单个约束失败时,bean验证不会停止,因为它允许累积来自不同约束的错误消息。
因此,要解决您的问题,只需在AssertBoolean实现中加入一个空检查。