问题概述

关于这个问题,是在接口参数校验的时候遇到的,使用Spring Boot下spring-boot-starter-validation进行接口参数校验时出现 “ Validation failed for argument [0] in public … ”

我的使用过程

    <!-- 自定义验证注解 -->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.15.Final</version>
    </dependency>
  @ApiOperation("测试")
  @PostMapping("/checkblank")
  public AjaxResult verify(@Validated @RequestBody VerifyUserEntity entity) {

      System.out.println("123");

      return AjaxResult.success();
  }
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

@NoArgsConstructor
@Data
public class VerifyUserEntity {

    @ApiModelProperty(value = "用户code")
    @NotBlank(message = "用户code不能为空")
    @Size(min = 0, max = 50, message = "用户code不能超过50个字符")
    private String id;

    @ApiModelProperty(value = "名字")
    @NotBlank(message = "用户名称不能为空")
    private String label;

    @ApiModelProperty(value = "手机号")
    @NotNull(message = "手机号不能为空")
    private Long number;

   	@NotEmpty(message = "集合列表不能为空")
    List<VerifyUserEntity> verifyUserEntityList;
}

测试结果

{
    "msg": "Validation failed for argument [0] in public com.chinacoal.core.AjaxResult com.chinacoal.web.controller.qyapi.WeXinController.verify(com.chinacoal.web.entity.VerifyUserEntity): [Field error in object 'verifyUserEntity' on field 'id': rejected value [null]; codes [NotBlank.verifyUserEntity.id,NotBlank.id,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [verifyUserEntity.id,id]; arguments []; default message [id]]; default message [用户code不能为空]] ",
    "code": 500
}

问题原因

validation使用不当所致, 正常正常使用应该这样(但不是最优, 最优在下面)

    @ApiOperation("测试")
    @PostMapping("/checkblank")
    public AjaxResult verify(@Validated @RequestBody VerifyUserEntity entity, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return AjaxResult.error(bindingResult.getFieldError().getDefaultMessage());
        }
        System.out.println("123");
        return AjaxResult.success();
    }

返回结果

{
    "msg": "用户code不能为空",
    "code": 500
}

但这样每次都要写BindingResult ,代码看着也不好看, 所有在想有没有其它方法来解决这个问题, 后来想到了用统一全局异常处理器来处理这个问题, 方法如下

@RestControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 自定义验证异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error(e.getMessage(), e);
        String message = e.getBindingResult().getFieldError().getDefaultMessage();
        return AjaxResult.error(message);
    }
   }

控制层正常写

    @ApiOperation("测试")
    @PostMapping("/checkblank")
    public AjaxResult verify(@Validated @RequestBody VerifyUserEntity entity) {

        System.out.println("123");
        return AjaxResult.success();
    }

返回结果

{
    "msg": "用户code不能为空",
    "code": 500
}

问题解决

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐