我使用基于Spring注释的AOP来验证我对Jersery资源的请求。 我已经实现了一个Aspect如下。但是这个XBBridgeException并没有被Jersey ExceptionMapper捕获,而是从Servlet容器中抛出。
有关此的任何提示吗?
@Aspect
public class RequestValidationAspect {
@Autowired
private Validator validator;
@Pointcut("execution(public * com.mycompany.facade.*.convertRequest(com.mycompany.BaseRequest+,..)) && args(req,..)")
public void convertRequest(BaseRequest req) {
}
@Before("convertRequest(req)")
public <T extends BaseRequest> void validateRequest(T req) throws XBBridgeException {
Set<ConstraintViolation<T>> violations = null;
try {
violations = validator.validate(req, req.getValidatorGroup());
if (!violations.isEmpty()) {
throw new ValidationException("{validation exception}");
}
} catch (Throwable t) {
t.printStackTrace();
List<String> msgList = new ArrayList<>();
String msg;
if (t instanceof ValidationException) {
msg = "{bad request}";
for (ConstraintViolation<T> violation : violations) {
msgList.add(violation.getPropertyPath().toString() + " " + violation.getMessage());
}
} else {
msg = "{request:" + req.toString() + "}";
msgList.add("Runtime error");
}
throw new XBBridgeException("request validation exception", new RequestValidationException(msg, msgList, t));
}
}
public Validator getValidator() {
return validator;
}
public void setValidator(Validator validator) {
this.validator = validator;
}
}
答案 0 :(得分:0)
好的,我找到了解决方案:
问题是我的ExceptionMapper被输入来映射XBBridgeExceptions(ExceptionMapper)。
但Spring AOP方面(RequestValidationAspect)抛出UndeclaredThrowableException(这是XBBridgeException的包装器)。 由于UndeclaredThrowableException是一个RuntimeExpcetion,它没有被我的mapper截获。解决方法是为UndeclaredThrowableException异常编写另一个ExceptionMapper。
答案 1 :(得分:0)
我不确定XBBridgeException是否是您自己的异常,似乎无法找到对它的任何其他引用,但如果是,则可能更容易让它扩展RuntimeException。这将阻止它被包装在UndeclaredThrowableException中,因此您可以更自然地创建您想要首先创建的ExceptionMapper。