我正在使用Jersey(JAX-RS),而我正在尝试实施验证。发生验证错误时,我的应用程序返回了响应问题。现在响应如下:
[{
"message": "Custom message",
"messageTemplate": "{custom.message.template}",
"path": "SomeJerseyResource.resourceMethod.arg0.names[0]",
"invalidValue":"[value1, value2]"
}]
其中" SomeJerseyResourceClass.resourceMethod"是JAX-RS资源:
public class SomeJerseyResource {
@POST
@Path("/path")
public Response resourceMethod(@Valid RequestModel request) {
/** method body **/
}
}
并将验证约束分配给RequestModel中的getter:
public class RequestModel {
private List<String> names = new ArrayList<>();
@MyConstraint
public List<String> getNames() {
return tags;
}
}
我有一个自定义的ConstraintValidator,我在其中验证该List的每个元素。
问题
SomeJerseyResource.resourceMethod.arg0.names[0]
我只想要arg0.names[0]
。客户端并不了解服务器类和方法,当他收到类似的响应时,他无法正确地将错误分配给字段。我没有找到任何简单的方法来做到这一点。你有什么想法吗?
答案 0 :(得分:3)
您只需撰写ExceptionMapper<ConstraintViolationException>
即可返回自己喜欢的Response
。泽西岛使用ExceptionMapper<ViolationException>
。 ConstraintViolationException
从ViolationException
延伸,因此您的映射器更具体,并且在选择映射器时优先。泽西的映射器将响应返回为ValidationError
,这就是为什么它的主体就是它的原因。但你可以随心所欲地制作它。
如果您只想要invalidValue
列表,则只需遍历ConstraintViolation
中的ContraintViolationException.getConstraintViolations()
,然后从invalidValue
获取ConstraintViolation
。