0

我使用基于 Spring 注释的 AOP 来验证我对 Jersery 资源的请求。我已经实现了一个方面,如下所示。但是这个 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;
    }

}
4

2 回答 2

0

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

问题是我的 ExceptionMapper 被键入以映射 XBBridgeExceptions ( ExceptionMapper )。

但是 Spring AOP 方面 (RequestValidationAspect) 会抛出 UndeclaredThrowableException (这是一个围绕 XBBridgeException 的包装器)。由于 UndeclaredThrowableException 是一个 RuntimeExpcetion 它没有被我的映射器拦截。解决方案是为 UndeclaredThrowableException 异常编写另一个 ExceptionMapper。

于 2013-06-06T08:19:46.190 回答
0

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

于 2016-05-09T21:08:22.310 回答