Validation failed for argument [0] 参数校验失败的解决办法
问题概述关于这个问题,是在接口参数校验的时候遇到的,使用Spring Boot下spring-boot-starter-validation进行接口参数校验时出现 “Validation failed for argument [0] in public … ”我的使用过程<!-- 自定义验证注解 --><dependency><groupId>javax.va
·
问题概述
关于这个问题,是在接口参数校验的时候遇到的,使用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
}
问题解决
更多推荐
已为社区贡献5条内容
所有评论(0)