自定义

自定义异常解决者可以实现ExceptionResolver接口或者继承SimpleExceptionResolver类。

为了方便,我们这里以继承SimpleExceptionResolver类为例。

如果开发者需要自定义异常解决者,那么想必肯定是自定义了异常了,所以我们先定义一个异常的基类:

public class MyException extends HttpException {
    ...
}

定义异常解决者

public class MyResolver extends SimpleExceptionResolver {

    @ovrride
    protected View resolveException(Exception e) {
        if (e instanceof MyException) {
            MyException exception = (MyException) e;

            // 按照自己的逻辑处理后返回。
            return ...;
        }

        // 其它未知异常处理。
        String message = String.format("Server error occurred:\n%1$s", e.getMessage());
        HttpEntity httpEntity = new StringEntity(message, ContentType.TEXT_PLAIN);
        return new View(500, httpEntity);
    }
}

建议

一般服务器接口会统一返回数据格式,所以我们这里可以把Exception转为JSON返回给客户端。

定义异常:

public class MyException extends HttpException {
    private int code;
    private String message;

    public MyException(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

定义异常解决者:

public class MyResolver extends SimpleExceptionResolver {

    @ovrride
    protected View resolveException(Exception e) {
        if (e instanceof MyException) {
            MyException exception = (MyException) e;

            String json = JSON.toJSONString(exception);
            return new View(exception.getCode(), json);
        }

        // 其它未知异常处理。
        String message = String.format("服务器发生异常:\n%1$s", e.getMessage());
        MyException exception = new MyException(500, message);
        return new View(exception.getCode(), json);
    }
}

这样处理后,当服务器抛出异常后,客户端接收到的数据将是JSON格式:

{
    "code":"401",
    "message":"请您先登录"
}

未知异常:

{
    "code":"500",
    "message":"服务器发生异常:/user/admin"
}

results matching ""

    No results matching ""