参考:https://www.imgeek.org/article/825359442
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
校验注解
import org.springframework.validation.annotation.Validated;
@Validated
public @interface RPCValidated {
}
使用AOP来进行参数解析校验
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.hibernate.validator.resourceloading.PlatformResourceBundleLocator;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Aspect
@Component
@Slf4j
public class RpcValidatedAspect {
private static Validator validator;
static {
validator = Validation.byDefaultProvider().configure()
.messageInterpolator(new ResourceBundleMessageInterpolator(
new PlatformResourceBundleLocator("validationMessages")))
.buildValidatorFactory().getValidator();
}
@Pointcut("@within(com.yangsan.RpcValidated)")
protected void pointcut() {
}
@Around("pointcut()")
public Object advice(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
// 执行方法参数的校验
Set<ConstraintViolation<Object>> constraintViolations = validator.forExecutables().validateParameters(joinPoint.getThis(), signature.getMethod(), args);
List<String> messages = new ArrayList<>();
for (ConstraintViolation<Object> error : constraintViolations) {
messages.add(MessageFormat.format("[value : {0}, message : {1}]", error.getInvalidValue() ,error.getMessage()));
}
if (!messages.isEmpty()) {
return RespUtils.build("参数校验失败", String.join(",", messages));
}
return joinPoint.proceed(args);
}
}
使用方法:1. 在接口实现类增加@RpcValidated注解
@Override
@RPCValidated
public Response create(MessageSmsRechargeDto dto) {
//todo:业务逻辑......
}
2. 在接口方法中增加@Valid注解
Response create(@Valid MessageSmsRechargeDto params);
3. 实体类定义
@Data
public class MessageSmsRechargeDto implements Serializable {
/**
* 充值公司
*/
@NotNull(message = "充值公司不能为空 ")
private Long companyId;
/**
* 充值备注
*/
@NotEmpty(message = "充值备注不能为空 ")
private String rechargeRemark;
}