在写api接口的时候,经常需要对参数做一些基本的校验判断,如果手动处理的话,不免太过繁琐,基于hibernate下的validator jar可以满足我们的需求。其为我们提供的很多注解校验像@NotEmpty、@NotNull、@NotBlank等等。对于大多数咱们写的接口,可能接收参数并没有用VO来接收,只是单纯的字符串,也是用的最多的。所以我们需要基于接口方法上进行注解参数空校验。
现在spring官方建议使用java配置来做我们开发,所以以下是让上述注解配置在spring4.x中生效,配置很简单:
首先在spring中创建:
@Bean
public MethodValidationPostProcessor mvp(){
return new MethodValidationPostProcessor();
}
MethodValidationPostProcessor 的bean;
其次在需要使用注解的web曾层类级别级别上添加注解:@Validated,来告诉MethodValidationPostProcessor当前CLss的bean需要开启方法级别的验证支持;
最后添加拦截400异常方法获取message消息,封装成你的通用API返回格式。
例:
import com.droilaw.robot.common.ApiResult;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Created by lancer Song on 2017-06-08.
*/
@RequestMapping("/demo")
@Validated
public class Demo {
@RequestMapping(value = "",method = RequestMethod.GET)
public ApiResult<String> testValid(@NotBlank(message = "param1参数不能为空") String param1,
@NotBlank(message = "param2参数不能为空") String param2){
return ApiResult.success();
}
}
通用异常捕获类:
/**
* Created by lancer Song on 2017-03-31.
* 统一捕获异常类
*/
@ControllerAdvice
@ResponseBody
public class BaseExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(BaseExceptionHandler.class);
/**
* 400 - Bad Request
* @param e
* @return
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ConstraintViolationException.class)
public ApiResult handleServiceException(ConstraintViolationException e) {
logger.error("错误的请求参数", e);
Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
ConstraintViolation<?> violation = violations.iterator().next();
String message = violation.getMessage();
return ApiResult.fail("parameter:" + message);
}
}
可以减少很多手动重复的空校验,便于开发。