하나의 주해 로 전역 매개 변수 검사 완료
6344 단어 자바
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
com.alibaba
fastjson
1.2.58
org.springframework.boot
spring-boot-starter-aop
org.apache.commons
commons-lang3
${commons-lang3.version}
commons-beanutils
commons-beanutils
1.9.3
2. 사용자 정의 매개 변수 검사 주석 과 이상
/**
* @Author: guandezhi
* @Date: 2019/12/17 16:55
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParamValidate {
}
/**
* @Author: guandezhi
* @Date: 2019/12/17 17:13
*/
public class ParamValidateException extends RuntimeException {
public ParamValidateException(String errorMsg) {
super(errorMsg);
}
public ParamValidateException(String errorMsg, Throwable e) {
super(errorMsg, e);
}
}
3. 매개 변수 검사 절단면 정의
/**
*
*
* @Author: guandezhi
* @Date: 2019/12/17 15:07
*/
@Slf4j
@Aspect
@Component
public class ParamValidateAspect {
@Resource
private LocalValidatorFactoryBean localValidatorFactoryBean;
/**
* controller ParamValidate
*/
@Pointcut("execution(public * com.gdz.demo.controller.*." +
"*(@com.gdz.demo.annotation.ParamValidate (*),..)) ||" +
" execution(public * com.gdz.demo.controller.*." +
"*(..,@com.gdz.demo.annotation.ParamValidate (*)))")
public void webLog() {
}
@Before("webLog()")
public void before(JoinPoint joinPoint) throws Exception {
doBefore(joinPoint);
}
/**
*
*
* @param joinPoint
*/
private void doBefore(JoinPoint joinPoint) {
Object paramValue = getMethodParamValue(joinPoint);
if (paramValue != null) {
Set> validErrors = this.localValidatorFactoryBean.validate(paramValue, new Class[]{Default.class});
Iterator iterator = validErrors.iterator();
StringBuilder errorMsg = new StringBuilder();
while (iterator.hasNext()) {
ConstraintViolation constraintViolation = (ConstraintViolation) iterator.next();
String error = constraintViolation.getPropertyPath() + ":" + constraintViolation.getMessage();
errorMsg.append(iterator.hasNext() ? error + "; " : error);
}
if (!validErrors.isEmpty()) {
throw new ParamValidateException(errorMsg.toString());
}
}
}
/**
*
*
* @param joinPoint
* @return
*/
private Object getMethodParamValue(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
/* @ParamValidate */
Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations();
if (parameterAnnotations != null) {
for (Annotation[] parameterAnnotation : parameterAnnotations) {
int paramIndex = ArrayUtils.indexOf(parameterAnnotations, parameterAnnotation);
for (Annotation annotation : parameterAnnotation) {
if (annotation != null && annotation instanceof ParamValidate) {
return args[paramIndex];
}
}
}
}
return null;
}
}
4. 전역 캡 처 매개 변수 가 이상 을 검사 하고 원 하 는 형식 으로 되 돌려 줍 니 다.
/**
* @Author: guandezhi
* @Date: 2019/12/17 16:53
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ResultVo
5. 테스트 해 보기: 검사 가 필요 한 매개 변수 옆 에 @ ParamValidate 만 추가 하면 됩 니 다.
/**
* @Author: guandezhi
* @Date: 2020/1/17 15:04
*/
@Slf4j
@RestController
public class IndexController {
@PostMapping("/index")
public String test(@RequestBody @ParamValidate User user) {
return "success";
}
}
그 중에서 사용자 실 체 는 다음 과 같다.
/**
* @Author: guandezhi
* @Date: 2020/1/17 15:05
*/
@Data
public class User {
@NotNull(message = " ")
private String userName;
@NotBlank
private String city;
@Min(value = 1, message = " 1")
@Max(value = 99, message = " 99")
private int age;
@Size(min = 1, max = 3, message = " 1 , 3 ")
private List alias;
}
테스트 결 과 는 다음 과 같다.
{
"resultCode": 401,
"resultMsg": " ,alias: 1 , 3 ; age: 99; userName: ",
"data": null
}
코드 주소:https://github.com/dezhiguan/paramvalidate.git
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.