import com.****.logistics.***.contract.CommonResponse;
import com.****.logistics.***.print.pdf.utils.SpringHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
@Slf4j
@Activate(
group = {"provider"}
)
public class ValidatorExceptionFilter implements Filter {
private static final ExecutableValidator EXECUTABLE_VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator().forExecutables();
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Method method = getMethod(invoker, invocation);
Class<?> inf = invoker.getInterface();
Object object = SpringHelper.getBean(inf);
Object[] paramList = invocation.getArguments();
Validator validator = SpringHelper.getBean(Validator.class);
Set<ConstraintViolation<Object>> constraintViolations = new HashSet<>();
for (Object o : paramList) {
constraintViolations.addAll(validator.validate(o));
}
CommonResponse commonResponse = getValidationResult(constraintViolations);
if (Objects.nonNull(commonResponse)) {
Result result = new AsyncRpcResult(invocation);
result.setValue(commonResponse);
return result;
}
return invoker.invoke(invocation);
}
private static Method getMethod(Invoker<?> invoker, Invocation invocation) {
Method[] methods = invoker.getInterface().getDeclaredMethods();
for (Method m : methods) {
boolean needCheck = m.getName().equals(invocation.getMethodName())
&& invocation.getArguments().length == m.getParameterCount();
if (needCheck) {
if (matchMethod(invocation.getParameterTypes(), m.getParameterTypes())) {
return m;
}
}
}
return null;
}
private static boolean matchMethod(Class[] invokerMethodParamClassList, Class[] matchMethodParamClassList) {
for (int i = 0; i < invokerMethodParamClassList.length; i++) {
if (!invokerMethodParamClassList[i].equals(matchMethodParamClassList[i])) {
return false;
}
}
return true;
}
private static <T> CommonResponse getValidationResult(Set<ConstraintViolation<T>> set) {
if (set != null && !set.isEmpty()) {
StringBuilder stringBuilder = new StringBuilder();
for (ConstraintViolation<T> violation : set) {
stringBuilder.append(String.format("%s-%s", violation.getPropertyPath().toString(), violation.getMessage()));
System.out.println(String.format("-----%s-%s", violation.getPropertyPath().toString(), violation.getMessage()));
}
return CommonResponse.fail(String.join(",", stringBuilder.toString()));
}
return null;
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Objects;
@Component
public class SpringHelper implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public synchronized void setApplicationContext(ApplicationContext applicationContext) {
if (Objects.isNull(SpringHelper.applicationContext)) {
SpringHelper.applicationContext = applicationContext;
}
}
public static <T> T getBean(Class<T> tClass) {
return applicationContext.getBean(tClass);
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String beanName) {
return (T) applicationContext.getBean(beanName);
}
}