我正在使用 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,我在其中验证该列表的每个元素。
问题
- 我不想在响应的“路径”字段中包含资源和方法名称。代替
SomeJerseyResource.resourceMethod.arg0.names[0]
我只想要arg0.names[0]
。客户端不知道服务器类和方法,当他收到这样的响应时,他将无法正确地将错误分配给字段。 - 我想自定义响应的“invalidValue”字段。更具体地说,只有无效的元素值,而不是该字段中的整个列表。
我没有找到任何简单的方法来做到这一点。你有什么想法吗?
最佳答案
你可以写一个 ExceptionMapper<ConstraintViolationException>
返回 Response
你喜欢的。 Jersey 使用 ExceptionMapper<ViolationException>
. ConstraintViolationException
从 ViolationException
延伸,所以你的映射器更具体,并且会优先选择映射器。 Jersey 的映射器,将响应返回为 ValidationError
,所以 body 才会这样。但是你可以随心所欲地制作它。
如果您只想要 invalidValue
列表,然后遍历 ConstraintViolation
来自 ContraintViolationException.getConstraintViolations()
, 并得到 invalidValue
来自 ConstraintViolation
.
关于java - Jersey,JSR 303 验证 - ValidationError 中的自定义 "path"和 "invalidValue",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28529204/