Controller参数校验
1.拦截Controller抛出的异常
@ControllerAdvice
public class ControllerValidationHandler {
@ExceptionHandler(MethodArgumentNotValidException.class) //拦截@valid没有通过的异常
@ResponseBody
public String processValidationError(MethodArgumentNotValidException ex) {
BindingResult result = ex.getBindingResult();
FieldError error = result.getFieldError();
if (error != null) {
return result.getObjectName() + ":" + error.getDefaultMessage();
}
return null;
}
@ExceptionHandler(HttpMessageNotReadableException.class) //拦截json转换不成功的异常
@ResponseBody
public String processValidationError2(HttpMessageNotReadableException ex) {
return ex.getMessage();
}
}
2.Controller层代码
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
IUserService userService;
@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public String test(HttpServletRequest request, @Valid @RequestBody TestVO restVO) {
return restVO.toString();
}
}
3.TestVO实体类
public class TestVO {
private Integer price;
@Length(min = 3, max = 10,message = "内容应该在3-10字符之间")
private String content;
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "TestVO{" +
"price=" + price +
", content='" + content + '\'' +
'}';
}
}
4.pom配置
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.apache.bval</groupId>
<artifactId>bval-jsr</artifactId>
<version>1.1.2</version>
</dependency>
5.注解类
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = LengthValidator.class)
public @interface Length {
int min() default 0;
int max() default 2147483647;
String message() default "length is wrong";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class LengthValidator implements ConstraintValidator<Length, CharSequence> {
private int min;
private int max;
public LengthValidator() {
}
public void initialize(Length parameters) {
this.min = parameters.min();
this.max = parameters.max();
}
public boolean isValid(CharSequence value, ConstraintValidatorContext constraintValidatorContext) {
if(value == null) {
return true;
} else {
int length = value.length();
return length >= this.min && length <= this.max;
}
}
}
6、总结
这里使用的是自己实现的@length注解,实际使用中可以使用hibernate-validation这个包的实现

浙公网安备 33010602011771号