约束验证顺序 - 泽西岛
Order of constraint validation - Jersey
我正在使用 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
.这意味着它在 @NotEmpty
.
之前验证 @AssertBoolean
我可以在验证时强制下单吗?还是我必须在我的验证器中检查 null
?
这实际上是一个关于 Bean Validation 约束排序的问题,因为 JAX-RS 依赖于 Bean Validation 规范,而 Jersey 依赖于 hibernate-validator 提供的实现。
要按顺序评估约束注释,需要 java.lang.reflect.Field 允许按声明顺序检索注释。实际行为似乎是 .
然后看看这个 Whosebug answer:它指出现在不支持对 bean 验证约束的显式排序,并链接到允许这样做的提案。
要考虑的另一点是,当单个约束失败时,bean 验证不会停止,因为它允许累积来自不同约束的错误消息。
因此,要解决您的问题,只需在您的 AssertBoolean 实现中加入空检查即可。
我正在使用 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
.这意味着它在 @NotEmpty
.
@AssertBoolean
我可以在验证时强制下单吗?还是我必须在我的验证器中检查 null
?
这实际上是一个关于 Bean Validation 约束排序的问题,因为 JAX-RS 依赖于 Bean Validation 规范,而 Jersey 依赖于 hibernate-validator 提供的实现。
要按顺序评估约束注释,需要 java.lang.reflect.Field 允许按声明顺序检索注释。实际行为似乎是
然后看看这个 Whosebug answer:它指出现在不支持对 bean 验证约束的显式排序,并链接到允许这样做的提案。
要考虑的另一点是,当单个约束失败时,bean 验证不会停止,因为它允许累积来自不同约束的错误消息。
因此,要解决您的问题,只需在您的 AssertBoolean 实现中加入空检查即可。