Jersey ExceptionMapper不会拦截从Spring AspectJ注释的Aspects抛出的异常?

时间:2013-06-05 10:25:16

标签: spring jersey aop aspectj spring-aop

我使用基于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;
    }

}

2 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案:

问题是我的ExceptionMapper被输入来映射XBBridgeExceptions(ExceptionMapper)。

但Spring AOP方面(RequestValidationAspect)抛出UndeclaredThrowableException(这是XBBridgeException的包装器)。 由于UndeclaredThrowableException是一个RuntimeExpcetion,它没有被我的mapper截获。解决方法是为UndeclaredThrowableException异常编写另一个ExceptionMapper。

答案 1 :(得分:0)

我不确定XBBridgeException是否是您自己的异常,似乎无法找到对它的任何其他引用,但如果是,则可能更容易让它扩展RuntimeException。这将阻止它被包装在UndeclaredThrowableException中,因此您可以更自然地创建您想要首先创建的ExceptionMapper。