Jersey,JSR 303验证 - ValidationError中的自定义“path”和“invalidValue”

时间:2015-02-15 17:58:12

标签: java validation jersey jax-rs bean-validation

我正在使用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的每个元素。

问题

  • 我不想在&#34;路径&#34;中包含资源和方法名称。响应领域。代替 SomeJerseyResource.resourceMethod.arg0.names[0]我只想要arg0.names[0]。客户端并不了解服务器类和方法,当他收到类似的响应时,他无法正确地将错误分配给字段。
  • 我想自定义&#34; invalidValue&#34;回应的领域。更具体地说,只有无效的元素值,而不是该字段中的整个列表。

我没有找到任何简单的方法来做到这一点。你有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您只需撰写ExceptionMapper<ConstraintViolationException>即可返回自己喜欢的Response。泽西岛使用ExceptionMapper<ViolationException>ConstraintViolationExceptionViolationException延伸,因此您的映射器更具体,并且在选择映射器时优先。泽西的映射器将响应返回为ValidationError,这就是为什么它的主体就是它的原因。但你可以随心所欲地制作它。

如果您只想要invalidValue列表,则只需遍历ConstraintViolation中的ContraintViolationException.getConstraintViolations(),然后从invalidValue获取ConstraintViolation