我正在为我的REST服务设计一个异常类层次结构,并面临以下问题。 请注意,解决方案必须与Java 7兼容。REST服务的异常层次结构
假设我正在构建一个管理考试的系统。比方说,我有以下资源:
- 学生(studentId,名字,姓氏,...)
- 课程(courseId,姓名,...)
- 考试(examId,等级。 ..)
和以下操作(其中包括):
- GET /学生/ {} studentId
- GET /场/ {courseId}
- POST /学生/ {studentId} /考试(与包含的档次和courseId体)
注意,对于一些操作courseId作为一个部分提供的URL和其他作为请求主体的一部分。
我想设计一个异常类层次结构以一致的方式向客户端报告错误。我想对每个异常类的以下属性:
- 的StatusCode - 为对响应的HTTP状态代码,
- 的errorCode - 错误的唯一标识符,
- 的errorMessage - 人类可读的描述的错误。
现在让我们来关注“无效ID”类错误。我有以下要求:
如果无效ID被作为URL的一部分设置,的StatusCode应该是404(未找到)。如果它是作为请求主体的一部分提供的,那么它应该是400(错误请求)。
errorCode/errorMessage应该从业务角度确定错误。 errorCode应该是一个能够唯一标识错误原因的数字(假设为1代表invalid-studentId,2代表invalid-courseId等),errorMessage应该描述人类可重写格式的原因(例如“ID为Student [135]不存在。“)
的问题是,我怎么这两个ortogonal层次合并成一个单一异常类层次结构?
理想我想有follwing异常类:
public abstract class ApiException extends Exception {
public abstract int getStatusCode();
public abstract int getErrorCode();
public abstract String getErrorMessage();
}
public abstract class NotFoundException extends ApiException {
public int getStatusCode() {
return 404;
}
}
public abstract class BadRequestException extends ApiException {
public int getStatusCode() {
return 400;
}
}
public abstract class InvalidCourseIdException extends ApiException {
private final String courseId;
public InvalidCourseIdException(final String courseId) {
this.courseId = courseId;
}
public int getErrorCode() {
return 2;
}
public String getErrorMessage() {
return "Course with ID [" + courseId + "] does not exist.";
}
}
public class CourseNotFoundException extends NotFoundException, InvalidCourseException {
public CourseNotFoundException(String courseId) {
super(courseId);
}
}
public class BadCourseException extends BadRequestException, InvalidCourseException {
public BadCourseException(String courseId) {
super(courseId);
}
}
...
当然,多重继承不可用Java编写的。我如何设计一个兼容Java 7的类层次结构,遵守DRY原则(我希望只在一个地方定义每个常量值)?
我认为你需要在这里看一下KISS原则而不是DRY。从开发角度来看,我希望能够快速查找是什么导致了异常,或者当我抛出一个异常时会发生什么。我不想拖拉一个复杂的层次来做到这一点。 – tom 2014-09-05 15:10:39