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

时间:2017-10-24 05:41:51

标签: validation exception 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;
}

然后我在控制器中使用@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);
//          }  

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

是的,如果我只有param而不是请求者,如何抛出异常?例如

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

2 个答案:

答案 0 :(得分:2)

如果您在@Valid上使用OrderDetailPO注释,则可以使用一些选项来处理无效请求。

选项1:

您在方法签名中使用BindingResult,就像在代码中一样。现在你可以使用if (bindingResult.hasErrors()),如果它是真的,你可以自由地做你想做的任何事情。您可以抛出自己的异常,返回自定义信息或继续使用您的代码。那是你的决定。你不必抓住任何例外。

选项2:

删除方法签名中的BindingResult。这意味着Spring会自动向客户端返回BadRequest。它会响应org.springframework.web.bind.MethodArgumentNotValidException",其中包含有关无效请求的所有信息。在这种情况下,您不会输入您的方法。与选项1相同,不得捕获任何异常。

答案 1 :(得分:0)