From 9a56ec743c53748fd85e1fec7211d01c25c66599 Mon Sep 17 00:00:00 2001 From: wangfs <15029758498@163.com> Date: Tue, 31 Jul 2018 21:17:08 +0800 Subject: [PATCH] 增加权限及全局异常统一封装 --- src/main/java/com/zteits/oa/api/base/annotation/NoAuth.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/zteits/oa/api/base/bean/BizResult.java | 4 ++-- src/main/java/com/zteits/oa/api/base/bean/ResultBean.java | 16 ++++++++-------- src/main/java/com/zteits/oa/configuration/ControllerExceptionHandler.java | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/zteits/oa/configuration/WebMvcConfig.java | 44 +++++++++++++++++++++++++------------------- src/main/java/com/zteits/oa/configuration/auth/AuthInterceptor.java | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/zteits/oa/report/biz/AsraProjectServiceImpl.java | 5 +++++ src/main/java/com/zteits/oa/report/web/AsraProjectController.java | 2 ++ src/main/java/com/zteits/oa/util/BeanValidatorsUtils.java | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 516 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/zteits/oa/api/base/annotation/NoAuth.java create mode 100644 src/main/java/com/zteits/oa/configuration/ControllerExceptionHandler.java create mode 100644 src/main/java/com/zteits/oa/configuration/auth/AuthInterceptor.java create mode 100644 src/main/java/com/zteits/oa/util/BeanValidatorsUtils.java diff --git a/src/main/java/com/zteits/oa/api/base/annotation/NoAuth.java b/src/main/java/com/zteits/oa/api/base/annotation/NoAuth.java new file mode 100644 index 0000000..3d69fa9 --- /dev/null +++ b/src/main/java/com/zteits/oa/api/base/annotation/NoAuth.java @@ -0,0 +1,45 @@ +package com.zteits.oa.api.base.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Copyright: Copyright (c) 2017 zteits + * + * @ClassName: com.clouds.common.annotation + * @Description: 此注解为不进行权限校验的注解,标注到方法、类上 + * @version: v1.0.0 + * @author: atao + * @date: 2017/7/10 下午7:07 + * Modification History: + * Date Author Version Description + * ---------------------------------------------------------* + * 2017/7/10 atao v1.0.0 创建 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +public @interface NoAuth { + /** + * 描述 + * @return + */ + String desc() default ""; + + /** + * 测试环境下是否需要权限认证 默认不需要 + * @return + */ + boolean dev() default false; + + /** + * 生产环境下是否需要权限认证 默认需要 + * @return + */ + boolean pro() default true; + + +} diff --git a/src/main/java/com/zteits/oa/api/base/bean/BizResult.java b/src/main/java/com/zteits/oa/api/base/bean/BizResult.java index ee53a1f..f4d9646 100644 --- a/src/main/java/com/zteits/oa/api/base/bean/BizResult.java +++ b/src/main/java/com/zteits/oa/api/base/bean/BizResult.java @@ -39,7 +39,7 @@ public class BizResult extends ResultBean{ public BizResult(T data) { super(data); - this.errCode=ErrorType.BIZ_SUCCESS; + this.errCode=ErrorType.BIZ_SUCCESS.getCode(); this.errMsg = ErrorType.BIZ_SUCCESS.getMsg(); } @@ -49,7 +49,7 @@ public class BizResult extends ResultBean{ } public void setErrorInfo(ErrorType errType, String errMsg){ - this.errCode = errType; + this.errCode = errType.getCode(); this.errMsg = errMsg; this.success = false; } diff --git a/src/main/java/com/zteits/oa/api/base/bean/ResultBean.java b/src/main/java/com/zteits/oa/api/base/bean/ResultBean.java index 2a06668..0950f5b 100644 --- a/src/main/java/com/zteits/oa/api/base/bean/ResultBean.java +++ b/src/main/java/com/zteits/oa/api/base/bean/ResultBean.java @@ -13,7 +13,7 @@ public class ResultBean implements Serializable { boolean success; String errMsg; DATA data; - CODE errCode; + String errCode; String helpMsg; public ResultBean() { @@ -28,24 +28,24 @@ public class ResultBean implements Serializable { this.success = success; } public ResultBean(CODE errCode) { - this.errCode = errCode; + this.errCode = errCode.getCode(); this.success = false; } public ResultBean(CODE errCode,String errMsg) { - this.errCode = errCode; + this.errCode = errCode.getCode(); this.errMsg = errMsg; this.success = false; } public ResultBean(CODE errCode,String errMsg, DATA data) { - this.errCode = errCode; + this.errCode = errCode.getCode(); this.errMsg = errMsg; this.data = data; this.success = false; } public ResultBean(boolean success, CODE errCode,String errMsg, DATA data) { - this.errCode = errCode; + this.errCode = errCode.getCode(); this.errMsg = errMsg; this.data = data; this.success = success; @@ -88,7 +88,7 @@ public class ResultBean implements Serializable { * 重新初始化bean的所有属性 */ public void init(boolean success, CODE errCode,String errMsg, DATA data) { - this.errCode = errCode; + this.errCode = errCode.getCode(); this.errMsg = errMsg; this.data = data; this.success = success; @@ -119,10 +119,10 @@ public class ResultBean implements Serializable { } - public ErrorCode getErrCode() { + public String getErrCode() { return errCode; } - public void setErrCode(CODE errCode) { + public void setErrCode(String errCode) { this.errCode = errCode; } /** diff --git a/src/main/java/com/zteits/oa/configuration/ControllerExceptionHandler.java b/src/main/java/com/zteits/oa/configuration/ControllerExceptionHandler.java new file mode 100644 index 0000000..9721220 --- /dev/null +++ b/src/main/java/com/zteits/oa/configuration/ControllerExceptionHandler.java @@ -0,0 +1,186 @@ +package com.zteits.oa.configuration; + +import java.util.List; +import java.util.UUID; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.ConstraintViolationException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.web.AbstractErrorController; +import org.springframework.boot.autoconfigure.web.ErrorAttributes; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.NoHandlerFoundException; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.zteits.oa.api.base.annotation.NoAuth; +import com.zteits.oa.api.base.bean.BizResult; +import com.zteits.oa.api.base.constants.ErrorType; +import com.zteits.oa.api.base.exception.AppException; +import com.zteits.oa.api.base.exception.BizException; +import com.zteits.oa.util.BeanValidatorsUtils; + + +/** + * 通用错误处理器 + * + * Copyright: Copyright (c) 2017 zteits + * + * @ClassName: ControllerExceptionHandler.java + * @Description: + * @version: v1.0.0 + * @author: zhaowg + * @date: 2017年5月8日 上午11:50:23 + * Modification History: + * Date Author Version Description + * ---------------------------------------------------------* + * 2017年5月8日 zhaowg v1.0.0 创建 + */ +@Order(Ordered.HIGHEST_PRECEDENCE) +@ControllerAdvice +@Controller +@RequestMapping("${server.error.path:${error.path:/error}}") +public class ControllerExceptionHandler extends AbstractErrorController { + + public ControllerExceptionHandler(ErrorAttributes errorAttributes) { + super(errorAttributes); + } + + private static final Logger log = LoggerFactory.getLogger(ControllerExceptionHandler.class); + + @Value("${server.error.path:${error.path:/error}}") + private static String errorPath = "/error"; + + /** + * 500错误. + * + * @param req + * @param rsp + * @param ex + * @return + * @throws Exception + */ + @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(Exception.class) + @NoAuth + public ResponseEntity> serverError(HttpServletRequest req, HttpServletResponse rsp, Exception ex) throws Exception { + String uuid = UUID.randomUUID().toString().toUpperCase().replace("-", ""); + log.error("\n############################ "+uuid+",请求地址:{},500错误 #############################",req.getRequestURI()); + BizResult BizResult = null; + if(ex instanceof AppException) { + AppException bizException = (AppException)ex; + BizResult = new BizResult<>(bizException.getErrCode(),bizException.getErrMsg()); + log.error("\n############################ "+uuid+",后场返回的错误信息为: #############################\n"+bizException.getErrMsg()); + }else if(ex instanceof ConstraintViolationException){ + List errMsgs = BeanValidatorsUtils.extractPropertyAndMessageAsList((ConstraintViolationException)ex, ": "); + BizResult = new BizResult<>(ErrorType.PARAM_NOT_VALID, JSON.toJSONString(errMsgs)); + }else{ + BizResult = new BizResult<>(ErrorType.SYSTEM_ERROR,ex.getMessage()); + log.error("\n############################ "+uuid+",前台报错堆栈信息为: #############################",ex); + } + + log.info("封装后的错误信息:\n"+JSONObject.toJSON(BizResult)); + return new ResponseEntity<>(BizResult, HttpStatus.OK); + } + + /** + * 404的拦截. + * + * @param request + * @param response + * @param ex + * @return + * @throws Exception + */ + @ResponseStatus(code = HttpStatus.NOT_FOUND) + @ExceptionHandler(NoHandlerFoundException.class) + @NoAuth + public ResponseEntity notFound(HttpServletRequest request, HttpServletResponse response, Exception ex) + throws Exception { + log.error("请求地址:{},404错误", request.getRequestURI(), ex); + BizResult BizResult = new BizResult<>(ErrorType.RESOURCE_NOT_EXISTS); + log.info("封装后的错误信息:\n"+JSONObject.toJSON(BizResult)); + return new ResponseEntity<>(BizResult, HttpStatus.OK); + } + + /** + * 400 参数不完整错误. + * + * @param req + * @param rsp + * @param ex + * @return + * @throws Exception + */ + @ResponseStatus(code = HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentNotValidException.class) + @NoAuth + public ResponseEntity methodArgumentNotValidException(HttpServletRequest req, HttpServletResponse rsp, + MethodArgumentNotValidException ex) throws Exception { + log.error("请求地址:{},400错误:", req.getRequestURI(),ex); + + BindingResult result = ex.getBindingResult(); + List fieldErrors = result.getFieldErrors(); + StringBuffer msg = new StringBuffer(); + msg.append("["); + fieldErrors.stream().forEach(fieldError -> { + msg.append(fieldError.getField() + ":" + fieldError.getDefaultMessage()); + }); + msg.append("]"); + + BizResult BizResult = new BizResult<>(ErrorType.PARAM_NOT_VALID, msg.toString()); + log.info("封装后的错误信息:\n"+JSONObject.toJSON(BizResult)); + return new ResponseEntity<>(BizResult, HttpStatus.OK); + } + + @RequestMapping + @ResponseBody + @NoAuth + public ResponseEntity handleErrors(HttpServletRequest request, HttpServletResponse response) throws Exception { + HttpStatus status = getStatus(request); + if (status == HttpStatus.NOT_FOUND) { + return notFound(request, response, new BizException(ErrorType.RESOURCE_NOT_EXISTS)); + } + + if (status == HttpStatus.BAD_REQUEST){ + return new ResponseEntity( new BizResult<>(ErrorType.PARAM_NOT_VALID, "参数异常"), + HttpStatus.OK); + } + + if (status == HttpStatus.INTERNAL_SERVER_ERROR){ + return serverError(request, response, new BizException(ErrorType.APP_ERROR)); + } + + + return new ResponseEntity( new BizResult<>(ErrorType.APP_ERROR, "系统异常"), + HttpStatus.OK); + } + + @RequestMapping(produces = "text/html") + @NoAuth + public ModelAndView handleHtml(HttpServletRequest request, HttpServletResponse response) throws Exception { + return null; + } + + @Override + @NoAuth + public String getErrorPath() { + return errorPath; + } +} \ No newline at end of file diff --git a/src/main/java/com/zteits/oa/configuration/WebMvcConfig.java b/src/main/java/com/zteits/oa/configuration/WebMvcConfig.java index 055b2ab..3b4d63a 100644 --- a/src/main/java/com/zteits/oa/configuration/WebMvcConfig.java +++ b/src/main/java/com/zteits/oa/configuration/WebMvcConfig.java @@ -1,16 +1,25 @@ package com.zteits.oa.configuration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.InterceptorRegistration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import com.zteits.oa.configuration.auth.AuthInterceptor; + @Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { + private Logger logger = LoggerFactory.getLogger(WebMvcConfig.class); + + @Autowired + private AuthInterceptor authInterceptor; + @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); @@ -20,23 +29,20 @@ public class WebMvcConfig extends WebMvcConfigurerAdapter { .addResourceLocations("classpath:/META-INF/resources/webjars/"); } - /** - * 实现登陆拦截.
- */ -// @Override -// public void addInterceptors(InterceptorRegistry registry) { -// InterceptorRegistration addInterceptor = null;//registry.addInterceptor(); -// -// addInterceptor.excludePathPatterns("/error"); -// -// addInterceptor.excludePathPatterns("/login**"); -// -// addInterceptor.addPathPatterns("/**"); -// -// -// -// } - + * sessionid 拦截 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + //添加验证拦截器 + registry.addInterceptor(authInterceptor) + .addPathPatterns("/**") + .excludePathPatterns("/oauth/**") + .excludePathPatterns("/selectItem/**") + .excludePathPatterns("/swagger-ui.html/**") + .excludePathPatterns("/swagger-resources/**") + .excludePathPatterns("/v2/**"); + } + -} + } diff --git a/src/main/java/com/zteits/oa/configuration/auth/AuthInterceptor.java b/src/main/java/com/zteits/oa/configuration/auth/AuthInterceptor.java new file mode 100644 index 0000000..73bb406 --- /dev/null +++ b/src/main/java/com/zteits/oa/configuration/auth/AuthInterceptor.java @@ -0,0 +1,124 @@ +package com.zteits.oa.configuration.auth; + +import java.io.PrintWriter; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import com.alibaba.fastjson.JSONObject; +import com.zteits.oa.api.base.annotation.NoAuth; +import com.zteits.oa.api.base.bean.BizResult; +import com.zteits.oa.api.base.constants.ErrorType; +import com.zteits.oa.api.base.constants.SessionEnum; +import com.zteits.oa.api.dto.asraop.LoginOathRes; + +/** + * Copyright: Copyright (c) 2017 zteits + * + * @ClassName: com.clouds.common.web.auth + * @Description: + * @version: v1.0.0 + * @author: atao + * @date: 2017/5/11 上午9:34 + * Modification History: + * Date Author Version Description + * ---------------------------------------------------------* + * 2017/5/11 atao v1.0.0 创建 + */ +@Component +public class AuthInterceptor extends HandlerInterceptorAdapter { + + private static final Logger log = LoggerFactory.getLogger(AuthInterceptor.class); + + private static final String MIME_JSON = "application/json;charset=UTF-8"; + +// @Autowired +// private RedisCacheUtil redisCacheUtil; + + //在请求进入controller前进行拦截 + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + log.info("===开始校验用户权限校验======"); + log.info("===开始校验用户权限校验 url为{}",request.getRequestURI()); + if(!isNeedAuth(handler)){ + log.info("===不需要进行权限校验"); + return true; + } + HttpSession session = request.getSession(); + System.out.println(request.getRequestURI()); + System.out.println("获取到的session="+session.getId()); + //定义初始化的变量 + Object object = session.getAttribute(SessionEnum.USER_INFO.key()); + if (null == object) { + log.info("===权限校验,用户未登陆!"); + setErrorResult(response, ErrorType.AUTH_TOKEN_NOT_EXISTS); + return false; + } + //LoginOathRes userInfo = (LoginOathRes)object; + + + + return true; + } + + /** + * 返回错误结果 + * + * @param response + * @param errortype 错误类型 + * @throws Exception + */ + private void setErrorResult(HttpServletResponse response, ErrorType errortype) throws Exception { + log.info("===校验用户权限 校验失败: ErrorType:errorCode={},errMsg={}", errortype.getCode(), errortype.getMsg()); + PrintWriter writer = response.getWriter(); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-type", MIME_JSON); + response.setContentType(MIME_JSON); + BizResult bizResult = new BizResult<>(errortype); + response.setStatus(HttpStatus.OK.value()); + writer.write(JSONObject.toJSON(bizResult).toString()); + writer.close(); + } + + /** + * 判断此次请求是否需要进行鉴权 + * @param handler + * @return true 需要权限校验 false 不需要权限校验 + */ + private boolean isNeedAuth(Object handler){ + log.info("==权限校验 判断是否需要进行权限校验"); + boolean flag = true; + if(handler instanceof HandlerMethod){ + + HandlerMethod handlerMethod = (HandlerMethod)handler; + log.info("===访问的Controller 为{},请求的方法为{}",handlerMethod.getBeanType().getName(),handlerMethod.getMethod().getName()); + + log.info(handlerMethod.getBeanType().getName()); + + boolean authFlag=handlerMethod.getBeanType().isAnnotationPresent(NoAuth.class); + if(authFlag){ + //如果Controller类上标注了NoAuth,整个类里面的方法都不需要进行权限校验 + return !authFlag; + } + + authFlag = handlerMethod.hasMethodAnnotation(NoAuth.class); + return !authFlag; + } + log.info("==权限校验 判断是否需要进行权限校验 flag={}",flag); + return flag; + } + +} + + diff --git a/src/main/java/com/zteits/oa/report/biz/AsraProjectServiceImpl.java b/src/main/java/com/zteits/oa/report/biz/AsraProjectServiceImpl.java index 3a71367..a1a464f 100644 --- a/src/main/java/com/zteits/oa/report/biz/AsraProjectServiceImpl.java +++ b/src/main/java/com/zteits/oa/report/biz/AsraProjectServiceImpl.java @@ -10,6 +10,8 @@ import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONObject; import com.zteits.oa.api.base.bean.BizResult; +import com.zteits.oa.api.base.constants.ErrorType; +import com.zteits.oa.api.base.exception.BizException; import com.zteits.oa.api.dto.asraproject.AsraProjectDTO; import com.zteits.oa.api.dto.param.AsraProjecQueryReq; import com.zteits.oa.api.service.report.query.AsraProjectService; @@ -36,6 +38,9 @@ public class AsraProjectServiceImpl implements AsraProjectService { List list = asraProjectDao.queryAsraProjectForList(asraProjecQueryReq); ListCopyUtil.listCopyProperties(list, listDTO, AsraProjectDTO.class); logger.info("---begin查询项目信息list"); + if(true){ + throw new BizException(ErrorType.BIZ_ERROR,"adadsad"); + } return new BizResult>(listDTO); } diff --git a/src/main/java/com/zteits/oa/report/web/AsraProjectController.java b/src/main/java/com/zteits/oa/report/web/AsraProjectController.java index bc2e078..57a9dd8 100644 --- a/src/main/java/com/zteits/oa/report/web/AsraProjectController.java +++ b/src/main/java/com/zteits/oa/report/web/AsraProjectController.java @@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import com.zteits.oa.api.base.bean.BizResult; +import com.zteits.oa.api.base.constants.ErrorType; +import com.zteits.oa.api.base.exception.BizException; import com.zteits.oa.api.dto.asraproject.AsraProjectDTO; import com.zteits.oa.api.dto.param.AsraProjecQueryReq; import com.zteits.oa.api.service.report.query.AsraProjectService; diff --git a/src/main/java/com/zteits/oa/util/BeanValidatorsUtils.java b/src/main/java/com/zteits/oa/util/BeanValidatorsUtils.java new file mode 100644 index 0000000..dd122a7 --- /dev/null +++ b/src/main/java/com/zteits/oa/util/BeanValidatorsUtils.java @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2005-2012 springside.org.cn + */ +package com.zteits.oa.util; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validation; +import javax.validation.Validator; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +/** + * JSR303 Validator(Hibernate Validator)工具类. + * + * ConstraintViolation中包含propertyPath, message 和invalidValue等信息. + * 提供了各种convert方法,适合不同的i18n需求: + * 1. List, String内容为message + * 2. List, String内容为propertyPath + separator + message + * 3. Map + * + * 详情见wiki: https://github.com/springside/springside4/wiki/HibernateValidator + * @author calvin + * @version 2013-01-15 + */ +public class BeanValidatorsUtils { + + private static Validator validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + /** + * 调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException. + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static void validateWithException(Object object) + throws ConstraintViolationException { + Set constraintViolations = validator.validate(object); + if (!constraintViolations.isEmpty()) { + throw new ConstraintViolationException(constraintViolations); + } + } + + /** + * 辅助方法, 转换ConstraintViolationException中的Set中为List. + */ + public static List extractMessage(ConstraintViolationException e) { + return extractMessage(e.getConstraintViolations()); + } + + /** + * 辅助方法, 转换Set为List + */ + @SuppressWarnings("rawtypes") + public static List extractMessage(Set constraintViolations) { + List errorMessages = Lists.newArrayList(); + for (ConstraintViolation violation : constraintViolations) { + errorMessages.add(violation.getMessage()); + } + return errorMessages; + } + + /** + * 辅助方法, 转换ConstraintViolationException中的Set为Map. + */ + public static Map extractPropertyAndMessage(ConstraintViolationException e) { + return extractPropertyAndMessage(e.getConstraintViolations()); + } + + /** + * 辅助方法, 转换Set为Map. + */ + @SuppressWarnings("rawtypes") + public static Map extractPropertyAndMessage(Set constraintViolations) { + Map errorMessages = Maps.newHashMap(); + for (ConstraintViolation violation : constraintViolations) { + errorMessages.put(violation.getPropertyPath().toString(), violation.getMessage()); + } + return errorMessages; + } + + /** + * 辅助方法, 转换ConstraintViolationException中的Set为List. + */ + public static List extractPropertyAndMessageAsList(ConstraintViolationException e) { + return extractPropertyAndMessageAsList(e.getConstraintViolations(), " "); + } + + /** + * 辅助方法, 转换Set为List. + */ + @SuppressWarnings("rawtypes") + public static List extractPropertyAndMessageAsList(Set constraintViolations) { + return extractPropertyAndMessageAsList(constraintViolations, " "); + } + + /** + * 辅助方法, 转换ConstraintViolationException中的Set为List. + */ + public static List extractPropertyAndMessageAsList(ConstraintViolationException e, String separator) { + return extractPropertyAndMessageAsList(e.getConstraintViolations(), separator); + } + + /** + * 辅助方法, 转换Set为List. + */ + @SuppressWarnings("rawtypes") + public static List extractPropertyAndMessageAsList(Set constraintViolations, + String separator) { + List errorMessages = Lists.newArrayList(); + for (ConstraintViolation violation : constraintViolations) { + errorMessages.add(violation.getPropertyPath() + separator + violation.getMessage()); + } + return errorMessages; + } +} \ No newline at end of file -- libgit2 0.21.4