在写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); } }
可以减少很多手动重复的空校验,便于开发。
