SpringMVC优雅的实现数据校验
2018-01-06 15:18
661 查看
我们在使用SpringMVC提供接口时,所提供的参数难免会进行参数的合法性校验,比如非空校验,最原始的办法就是手动校验,比如下面的代码:
如果一个两个参数还好,如果参数很多比如几十个,那么就要判断几十次,代码量剧增,可读性也不好。
SpringMVC为我们提供了Valid,通过Valid很方便的进行数据的合法性校验,请看代码:
在controller的方法需要校验的参数后面必须跟BindingResult,否则无法进行校验。但是这样会抛出异常,对用户而言不太友好!
那怎么办呢?
很简单,我们可以利用Spring的AOP特性,拦截异常,并输出友好的参数。接下来我们就来实现异常的拦截:
这样当我们传入不合法的参数时就会进入WebExceptionAspect类,从而输出友好参数。
我们再把验证的代码单独封装成方法:
这样每次参数校验只需要调用validate方法就行了,我们可以看到代码的可读性也大大的提高了。
if(StringUtils.isBlank(authorize.getClientId())){ log.debug("clientId为必填项!"); }
如果一个两个参数还好,如果参数很多比如几十个,那么就要判断几十次,代码量剧增,可读性也不好。
SpringMVC为我们提供了Valid,通过Valid很方便的进行数据的合法性校验,请看代码:
@GetMapping("authorize") public void authorize(@Valid AuthorizeIn authorize, BindingResult ret){ if(result.hasFieldErrors()){ List<FieldError> errorList = result.getFieldErrors(); //通过断言抛出参数不合法的异常 errorList.stream().forEach(item -> Assert.isTrue(false,item.getDefaultMessage())); } } public class AuthorizeIn extends BaseModel{ @NotBlank(message = "缺少response_type参数") private String responseType; @NotBlank(message = "缺少client_id参数") private String ClientId; private String state; @NotBlank(message = "缺少redirect_uri参数") private String redirectUri; public String getResponseType() { return responseType; } public void setResponseType(String responseType) { this.responseType = responseType; } public String getClientId() { return ClientId; } public void setClientId(String clientId) { ClientId = clientId; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getRedirectUri() { return redirectUri; } public void setRedirectUri(String redirectUri) { this.redirectUri = redirectUri; } }
在controller的方法需要校验的参数后面必须跟BindingResult,否则无法进行校验。但是这样会抛出异常,对用户而言不太友好!
那怎么办呢?
很简单,我们可以利用Spring的AOP特性,拦截异常,并输出友好的参数。接下来我们就来实现异常的拦截:
@Component @Aspect public class WebExceptionAspect implements ThrowsAdvice{ public static final Logger logger = LoggerFactory.getLogger(WebExceptionAspect.class); //拦截被GetMapping注解的方法 @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)") private void webPointcut() { } @AfterThrowing(pointcut = "webPointcut()",throwing = "e") public void afterThrowing(Exception e) throws Throwable { logger.debug("exception 来了!"); if(StringUtils.isNotBlank(e.getMessage())){ writeContent(e.getMessage()); }else{ writeContent("参数错误!"); } } /** * 将内容输出到浏览器 * * @param content * 输出内容 */ private void writeContent(String content) { HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .getResponse(); response.reset(); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Type", "text/plain;charset=UTF-8"); response.setHeader("icop-content-type", "exception"); PrintWriter writer = null; try { writer = response.getWriter(); writer.print((content == null) ? "" : content); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } }
这样当我们传入不合法的参数时就会进入WebExceptionAspect类,从而输出友好参数。
我们再把验证的代码单独封装成方法:
protected void validate(BindingResult result){ if(result.hasFieldErrors()){ List<FieldError> errorList = result.getFieldErrors(); errorList.stream().forEach(item -> Assert.isTrue(false,item.getDefaultMessage())); } }
这样每次参数校验只需要调用validate方法就行了,我们可以看到代码的可读性也大大的提高了。
相关文章推荐
- springmvc(四) springmvc的数据校验的实现
- SpringMVC实现页面和java模型的数据交互以及文件上传下载和数据校验
- springmvc(四) springmvc的数据校验的实现
- SpringMVC(20):数据校验功能 -- 使用JSR303实现服务器端的数据校验
- SpringMVC通过切面,实现超灵活的注解式数据校验
- SpringMVC 转换器实现控制器返回字节流数据优雅处理
- SpringMVC学习笔记六:使用 hibernate-validator注解式数据校验
- JSR 303 springmvc 数据校验
- springmvc中的数据校验
- 使用jsp来实现对表单对象当中的数据进行校验
- springmvc知识四------数据转换&数据格式化&数据校验
- SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换)
- struts2:数据校验,通过Action中的validate()方法实现校验,图解
- 用特性来实现数据的校验
- 5、springMVC的校验和数据回显
- 5、springMVC的校验和数据回显
- 在Struts 2_0中实现表单数据校验
- SpringMVC中的数据校验
- springmvc的数据校验
- JSR303的数据校验-Hibernate Validator方式实现