我正在爲我的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