【问题标题】:Return code error as ResponseEntity after DTO validation in REST API在 REST API 中进行 DTO 验证后,将代码错误作为 ResponseEntity 返回
【发布时间】:2017-07-27 12:33:54
【问题描述】:

使用https://www.leveluplunch.com/java/tutorials/017-validate-spring-rest-webservice-request/ 教程,我想使用java 验证表单而不重新加载页面。我在 REST API 中执行此操作。 我的控制器

@PutMapping(value = "/changeEmail", consumes = MediaType.APPLICATION_JSON_VALUE)
public HttpEntity<ChangeEmailDTO> showChangeEMail(
        @RequestBody @Valid ChangeEmailDTO changeEmailDTO,
        BindingResult result
) {
    System.out.println("Email: " + changeEmailDTO.getEmail());

    if(result.hasErrors()) {
        System.out.println("Error: " + changeEmailDTO.getEmail());
        return ResponseEntity.badRequest().body(changeEmailDTO);
    }

    System.out.println("Success: " + changeEmailDTO.getEmail());
    return ResponseEntity.ok(changeEmailDTO);
}

接受电子邮件地址,在注释中验证

    @NotEmpty
   @Getter @Setter private String email;

根据上面的指南,它应该以 json 形式返回错误代码。它收到的唯一效果是https://zapodaj.net/81a6db4635168.png.html。 所以它返回对象本身,不像教程中的那样

{"timestamp":1417379464584,"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.MethodArgumentNotValidException","message":"Validation failed for argument at index 0 in method: public org.springframework.http.ResponseEntity<demo.AgencyResource> demo.AgencyController.saveAgency(demo.AgencyResource), with 2 error(s): [Field error in object 'agencyResource' on field 'name': rejected value [null]; codes [NotNull.agencyResource.name,NotNull.name,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [agencyResource.name,name]; arguments []; default message [name]]; default message [may not be null]] [Field error in object 'agencyResource' on field 'id': rejected value [50]; codes [Max.agencyResource.id,Max.id,Max.java.lang.Integer,Max]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [agencyResource.id,id]; arguments []; default message [id],20]; default message [must be less than or equal to 20]] ","path":"/agencies"}

如何返回这些数据?

【问题讨论】:

    标签: java spring rest validation


    【解决方案1】:

    您正在使用 BindingResult.hasErrors() 控制 ValidationException 的响应。在这种情况下,您会返回带有错误请求 http 状态代码的 DTO,如下所示。

    return ResponseEntity.badRequest().body(changeEmailDTO);
    

    上面提到的教程有 spring 提供的默认异常处理程序,它将异常转换为该消息。

    只需从方法签名中删除 BindingResult,然后任何类型的验证异常都会被默认的 Exceptionhandler 捕获。然后你会得到上面提到的响应。

    【讨论】:

      【解决方案2】:

      showChangeEMail 方法签名和相应的if 中删除BindingResult result 参数,您将得到一个异常,就像您在上面提到的教程中一样。

      尽管如此,它可能看起来像一个错误或魔法,但它不是。 Spring-mvc 能够检查此参数是否存在,如果是,请不要抛出任何异常,假设您正在自己处理验证错误。否则 - 将引发异常。

      有关信息,请查看负责此行为的 RequestResponseBodyMethodProcessorsource

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 2020-01-27
        • 2015-03-21
        • 2018-05-03
        • 1970-01-01
        • 2019-01-22
        • 2011-09-05
        相关资源
        最近更新 更多