用java开发RESTful API时如何控制异常?

问题描述 投票:0回答:1

我正在为我们的客户开发 RESTful API。
如果发生某些错误,我将显示错误信息。
错误信息协议如下所示。

{ 
    "status": "failure",
    "error": {
        "message": "", 
        "type": "",
        "code": 0000 
    } 
} 

在编程层面,如何控制异常?
现在我已经创建了自定义异常类来扩展

Exception
类。 (不是
RuntimeException

这种做法好还是不好呢?使用 RuntimeException 更好吗?
我的自定义异常类是...

public class APIException extends Exception {
    public enum Code {      
        // duplicated exceptions
        ALREADY_REGISTERED(1001),
        
        // size exceptions
        OVER_KEYWORD_LIMIT(2001),
        OVER_CATEGORY_LIMIT(2002),
        TOO_SHORT_CONTENTS_LENGTH(2003),
        TOO_SHORT_TITLE_LENGTH(2004),

        // database exceptions
        DB_ERROR(3001),

        // unregistered exceptions
        UNREGISTERED_NAME(4001),

        // missing information exceptions
        MISSING_PARAMETER(5001),

        // invalid information exceptions
        INVALID_PARAMETER(6001),
        INVALID_URL_PATTERN(6002);

        private final Integer value;
        private Code(Integer value) {
            this.value = value;
        }
        public Integer getType() {
            return value;
        }
    }

    private final Code code;

    public APIException(Code code) {
        this.code = code;
    }
    public APIException(Code code, Throwable cause) {
        super(cause);
        this.code = code;
    }
    public APIException(Code code, String msg, Throwable cause) {
        super(msg, cause);
        this.code = code;
    }
    public APIException(Code code, String msg) {
        super(msg);
        this.code = code;
    }

    public Code getCode() {
        return code;
    }
}

并使用这样的 APIException 类...

public void delete(int idx) throws APIException {
    try {
        Product product = productDao.findByIdx(idx);
        if (product.getCount() > 0) {
            throw new APIException(Code.ALREADY_REGISTERED,
                    "Already registered product.");
        }
        productDao.delete(idx);
    } catch (Exception e) {
        throw new APIException(Code.DB_ERROR,
                "Cannot delete product. " + e.getMessage());
    }
}

制作自定义异常类或使用现有异常(如

IllegalArgumentException
)哪个更好。
如果制作自定义异常类更好,我应该在 Exception 或
RuntimeException
中扩展什么?
请给我推荐像我的情况这样的好例子。 预先感谢。

java spring api rest
1个回答
3
投票

既然你使用Spring,我建议:

  1. 扩展 RuntimeException 并让异常传递到控制器

  2. 如果您的异常类对您想要在错误 XML 中返回的属性进行建模,请对异常进行注释,以便可以将其作为响应返回(如果它们都具有相同的状态代码,则包括

    @ResponseStatus
    )。

  3. 在控制器上实现一个或多个

    @ExceptionHandler
    方法,将异常作为
    @ResponseBody
    返回并确保 HttpServletResponse 正确。比如:

    @ExceptionHandler
    @ResponseBody
    public ErrorResponse handleAPIException(APIException e, HttpServletResponse response) {
    // Set any response attributes you need...
        return e; // or some other response
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.