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这个包的实现
posted @ 2017-12-12 19:55  我真的什么都不懂  阅读(1347)  评论(0)    收藏  举报