spring boot验证器成功但没有异常抛出

vvs*_*man 3 validation exception spring-boot

我在 spring boot 中使用了验证器,但无法捕获任何异常,我的代码就是这样

首先我创建一个带注释的bean

@Data
@EqualsAndHashCode(callSuper = false)
public class OrderDetailPO extends BaseEntity<String>{

    private static final long serialVersionUID = 1L;
    @NotNull
    @Size(max=32,message="ordercode is null")
    private String orderCode;

    @NotBlank
    @Size(max=32,message="productMode is null")
    private String productMode;

    @NotBlank
    @Size(max=128,message="hotelType is null")
    private String hotelType;

    @NotBlank
    @Size(max=32,message="goodsId is null")
    private String goodsId;
}
Run Code Online (Sandbox Code Playgroud)

然后我在控制器中使用@validated

public Result<?> createOrderDetail( @RequestBody @Validated  OrderDetailPO orderDetail,BindingResult bindingResult) throws ParseException, UnsupportedEncodingException {

//       if (bindingResult.hasErrors()) {  
//              String errMsg="";
//              for(FieldError err: bindingResult.getFieldErrors()) {  
//                  errMsg += err.getField()+" is " + err.getCode();
//              }  
//              return Result.buildFail(errMsg);
//          }  
Run Code Online (Sandbox Code Playgroud)

然后我使用一个空请求发送到控制器,但没有任何反应......在我看来,我可以看到 bindingResult 中的错误,但是即使我删除了 bindingResult ,我也无法将异常捕获为 MethodArgumentNotValidException ,我该如何让异常出现?

是的,如果我只有参数而不是请求体,如何抛出异常?例如

 public Result<?> orderDetailSelByAccountId( @NotBlank @Size(min=10,max=32)@PathVariable(value="accountId") String accountId) {
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 5

如果您使用@Valid注释,您OrderDetailPO有一些选项来处理无效请求。

选项1:

您可以BindingResult像在代码中一样在方法签名中使用。现在你可以使用了if (bindingResult.hasErrors()),如果是真的,你可以自由地做任何你想做的事情。您可以抛出自己的异常、返回自定义消息或继续执行您的代码。那是你的决定。而且您不必捕获任何异常。

选项 2:

BindingResult在您的方法签名中删除。这意味着 Spring 会自动将 a 返回BadRequest给客户端。它将使用org.springframework.web.bind.MethodArgumentNotValidException有关无效请求的所有信息进行响应。在这种情况下,您将不会输入您的方法。与选项 1 相同,不必捕获异常。