如何处理从自定义HandlerMethodArgumentResolver抛出的异常?

时间:2016-01-13 09:35:27

标签: java spring spring-mvc

我试图自己解决参数。

public class NewHandler implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(Param.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

        // throw Exceptions here ?

        return null;
    }
}

我可以轻松地从NativeWebRequest获取输入参数,并将它们分配到相应的自定义@Param注释参数中。

问题是我还想在这个领域做一些语法检查/验证。但是如果我在' resolveArgument'中抛出异常,则会向用户显示完整的堆栈跟踪。那将太过分和不安全。我只想向用户返回一个JSON格式的消息,以显示哪个输入参数语法有错误。

1 个答案:

答案 0 :(得分:1)

resolveArgument()的实际逻辑委托给一个单独的方法并从那里抛出异常。然后,这可以由调用者处理。

class CustomException extends Exception {}       

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
    Object output = null;

    try {
        output = actualMethod();
    }
    catch (CustomException e) {
        // do your JSON error handling here     
    }

    return output;
}

private Object actualMethod() throws CustomException {
    if (somethingBadHappened) throw new CustomException();
    else return new Object();
}

通过在循环中包装上面的try / catch构造,您还可以实现重复检查(即用户有机会纠正他/她的错误输入)。