Jersey客户端中的ValidationError?

时间:2014-09-09 11:08:24

标签: java jersey jersey-2.0 jersey-client

我在泽西客户端的球衣资源中无法获得ValidationErrors。让我解释一下。

泽西资源中的一项功能:

@POST
@Produces({ MediaType.APPLICATION_JSON })
@Consumes(MediaType.APPLICATION_JSON)
public LoginInfo login(@NotNull @Valid Login login)

我的clientconfig:

ClientConfig clientConfig = new ClientConfig();
clientConfig.register(JacksonFeature.class);

我的球衣客户:

ClientBuilder.newClient(getClientConfig())

我的函数调用:

getTarget("/login").request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(login), LoginInfo.class);

只要我提供有效参数,所有工作都没有问题,当我提供null作为参数我得到异常时:

HTTP 400 Bad Request 

但是我期待ValidationError响应,因为bean验证失败了。

Bean验证和错误响应正在服务器上运行,例如使用简单的html测试,它显示了验证错误结构:

<div class="validation-errors"><div class="validation-error"><span class="message">may not be null</span> (<span class="path"><strong>path</strong> = LoginResource.login.arg0</span>, <span class="invalid-value"><strong>invalidValue</strong> = null</span>)</div></div>

如何在我的球衣客户端获得ValidationError?我可能需要以特殊方式配置它,或者我应该使用过滤器吗?

[编辑] 我打开了跟踪,当服务器上的验证失败时,服务器发送验证错误,但看起来泽西客户端没有对它做任何事情,它将它转换为BadRequestException。

6 < 400
6 < Content-Type: application/json
6 < Vary: Accept
[{"message":"may not be empty","messageTemplate":{org.hibernate.validator.constraints.NotBlank.message}","path":"RuleResource.add.arg0.description","invalidValue":""}]

1 个答案:

答案 0 :(得分:0)

回答我自己的问题; - )

看起来泽西客户端并不支持验证错误,所以我创建了一个客户端过滤器,当状态为400时,我得到实体并将验证错误放在列表中。接下来,我创建一个validationexception,其中包含验证错误并抛出它。在链路上我得到一个processingexception,在stacktrace中可以找到validationexception,还有验证错误。所以我从验证错误中创建一个很好的消息并抛出另一个异常,一直到我的gui代码,它只显示异常消息。

工作正常,感谢球衣的过滤灵活性!