我在泽西客户端的球衣资源中无法获得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":""}]
答案 0 :(得分:0)
回答我自己的问题; - )
看起来泽西客户端并不支持验证错误,所以我创建了一个客户端过滤器,当状态为400时,我得到实体并将验证错误放在列表中。接下来,我创建一个validationexception,其中包含验证错误并抛出它。在链路上我得到一个processingexception,在stacktrace中可以找到validationexception,还有验证错误。所以我从验证错误中创建一个很好的消息并抛出另一个异常,一直到我的gui代码,它只显示异常消息。
工作正常,感谢球衣的过滤灵活性!