添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
public class WordsRequest implements Serializable {
    private static final long serialVersionUID = 4048730427527061626L;
    @ApiModelProperty("昵称")
    private String nickname;
    @ApiModelProperty("留言内容")
    @Size(max = 30,min = 1,message = "留言内容过长")
    private String msgContent;
    @ApiModelProperty("消息类型 0 img  1语音  2文字")
    private Integer msgType;
ResponseEntity<BaseOutput<WordsDTO>> sendWords(
                                                     @Valid @RequestBody WordsRequest  wordsRequest ){

我们使用的版本是springboot 2.0.4.RELEASE

我们使用@Valid 验证WordsRequest 入参合法性,但是当msgContent内容长度超过限制30个字符。将响应客户端 

http code 400  Bad Request,并且没有任何错误提示。这样的体验非常得不友好。后端也没有任何日志输出。日志级别是INFO。

但是我们也已经统一拦截所有异常信息,那为啥没有日志打印并且响应请求也是400呢,代码如下。

    @ExceptionHandler(value = {Throwable.class})
    @ResponseBody
    public ResponseEntity<?> constraintViolationHandler(HttpServletRequest req, Throwable exception) {

当然我们想看到具体错误原因,才知道情况。 调整日志级别为DEBUG.看到打印日志信息,如下。

org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument at index 3 in method: org.springframework.http.ResponseEntity<crplatform.crp.domain.dto.BaseOutput<com.xuehai.crplatform.crp.domain.dto.wordsgroup.WordsDTO>> crplatform.crp.interfaces.controller.WordsGroupController.sendWords(java.lang.Long,java.lang.String,java.lang.String,crplatform.crp.domain.dto.wordsgroup.WordsRequest), with 1 error(s): [Field error in object 'wordsRequest' on field 'msgContent': rejected value [hello rgregregregregregregregrehh]; codes [Size.wordsRequest.msgContent,Size.msgContent,Size.java.lang.String,Size];

发现具体异常是MethodArgumentNotValidException,这个类。我得到最简单想法是先拦截这个异常类。

    @ExceptionHandler(value = {Throwable.class,MethodArgumentNotValidException.class})

重试部署试一试,但重启异常错误,错误如此下:

Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]

懵逼了!于是找度娘找到一个答案。https://yq.aliyun.com/articles/398366 

重写父类ResponseEntityExceptionHandler 的方法handleMethodArgumentNotValid

else if (ex instanceof MethodArgumentNotValidException) {
            //这里配置响应请求码400
			HttpStatus status = HttpStatus.BAD_REQUEST;
			return handleMethodArgumentNotValid((MethodArgumentNotValidException) ex, headers, status, request);
	 * Customize the response for MethodArgumentNotValidException.
	 * <p>This method delegates to {@link #handleExceptionInternal}.
	 * @param ex the exception
	 * @param headers the headers to be written to the response
	 * @param status the selected response status
	 * @param request the current request
	 * @return a {@code ResponseEntity} instance
	protected ResponseEntity<Object> handleMethodArgumentNotValid(
			MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        //响应体是null,没有数据。
        //我们要做得就是重写这个方法。    
		return handleExceptionInternal(ex, null, headers, status, request);

重新部署好了。能看到我们自定义的异常信息了-留言信息过长 。

@PostMapping("/update") @RequiresPermissions("user:update") public R update(@RequestBody @Valid UserEntity user) { userService.update(user); return R.ok();
Spring Boot 统一处理参数校验结果异常@Valid BindException MethodArgumentNotValidException 使用@ControllerAdvice统一处理参数校验的结果 如果你使用了@RequestBody @Valid 来封装参数并校验,这个时候这个异常处理器又不起作用了,需要再添加一个异常处理器 import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindExcept
事情要从校验入参属性说起,如果入参有几十个需要校验非空,如果写一堆的ifelse岂不难受,这时候我们就可以借鉴hibernate-validatorhibernate-validator框架来校验参数的非空性。 首先我们添加如下依赖: <!-- https://mvnreposito...
@Valid注解后404,无法访问 如果控制台没有报错。可以在org.springframework.web.servlet.DispatcherServlet#doDispatch 进行断点,会进入catch异常语句,看异常详细信息。 HV000030: No validator could be found for constraint ‘javax.validation.constraints.Pattern’ validating type ‘java.lang.Integer’. C