Java에서 오류 코드/스트링을 정의하는 가장 좋은 방법?
자바에서 웹 서비스를 작성하고 있는데, 에러 코드와 그에 따른 에러 스트링을 정의하는 최선의 방법을 찾고 있습니다.숫자 에러 코드와 에러 문자열을 함께 묶어야 합니다.에러 코드와 에러 문자열은, Web 서비스에 액세스 하고 있는 클라이언트에 송신됩니다.예를 들어 SQLException이 발생하면 다음을 수행할 수 있습니다.
// Example: errorCode = 1,
// errorString = "There was a problem accessing the database."
throw new SomeWebServiceException(errorCode, errorString);
클라이언트 프로그램에 다음과 같은 메시지가 표시될 수 있습니다.
"오류 #1이 발생했습니다.데이터베이스에 액세스하는 동안 문제가 발생했습니다."
은, 「○○○○○○○○…」입니다.Enum
의 「Override(오버라이드)」를 .toString
메서드를 사용하여 오류 문자열을 반환합니다.제가 생각해낸 것은 다음과 같습니다.
public enum Errors {
DATABASE {
@Override
public String toString() {
return "A database error has occured.";
}
},
DUPLICATE_USER {
@Override
public String toString() {
return "This user already exists.";
}
},
// more errors follow
}
질문입니다. 더 좋은 방법이 있을까요?외부 파일을 읽는 것보다 코드로 해결하는 것이 더 좋습니다.저는 이 프로젝트에서 Javadoc을 사용하고 있는데, 에러 코드를 인라인으로 문서화하여 문서에 자동으로 업데이트 할 수 있다면 도움이 될 것입니다.
확실히 열거형 솔루션의 구현이 개선되어 있습니다(일반적으로 매우 우수합니다).
public enum Error {
DATABASE(0, "A database error has occurred."),
DUPLICATE_USER(1, "This user already exists.");
private final int code;
private final String description;
private Error(int code, String description) {
this.code = code;
this.description = description;
}
public String getDescription() {
return description;
}
public int getCode() {
return code;
}
@Override
public String toString() {
return code + ": " + description;
}
}
toString()을 덮어쓰고 대신 설명만 반환할 수도 있습니다.잘 모르겠습니다.어쨌든, 요점은, 에러 코드 마다 개별적으로 오버라이드 할 필요는 없습니다.순서값을 사용하는 대신 코드를 명시적으로 지정했습니다.이것에 의해, 순서를 변경해, 에러를 추가/삭제하기 쉬워집니다.
이것은 국제화 되어 있지 않다는 것을 잊지 마십시오.그러나 웹 서비스 클라이언트가 로케일의 설명을 보내지 않는 한, 스스로 쉽게 국제화 할 수 없습니다.적어도 클라이언트 측에서는 i18n에 사용할 에러 코드를 가지고 있습니다.
저는 속성 파일에 오류 메시지를 외부화하는 것을 선호합니다.이것은, 애플리케이션의 국제화(언어 마다 1개의 속성 파일)의 경우에 매우 도움이 됩니다.또한 오류 메시지를 수정하는 것이 더 쉬우며 Java 소스를 다시 컴파일할 필요가 없습니다.
프로젝트에서는 일반적으로 에러 코드(문자열 또는 정수, 크게 상관 없음)가 포함된 인터페이스가 있으며, 이 인터페이스에 이 오류의 속성 파일에 키가 포함되어 있습니다.
public interface ErrorCodes {
String DATABASE_ERROR = "DATABASE_ERROR";
String DUPLICATE_USER = "DUPLICATE_USER";
...
}
다음을 수행합니다.
DATABASE_ERROR=An error occurred in the database.
DUPLICATE_USER=The user already exists.
...
이 솔루션의 또 다른 문제는 유지보수 가능성입니다.오류가 2개밖에 없고 코드 행은 12개입니다.관리해야 할 오류가 수백 개에 달할 때 Enumeration 파일을 상상해 보십시오.
toString()을 오버로드하는 것은 좀 이상한 것 같습니다.이것은 toString()의 통상의 사용법과는 다소 거리가 있는 것 같습니다.
그럼 어떻게 되는 거죠?
public enum Errors {
DATABASE(1, "A database error has occured."),
DUPLICATE_USER(5007, "This user already exists.");
//... add more cases here ...
private final int id;
private final String message;
Errors(int id, String message) {
this.id = id;
this.message = message;
}
public int getId() { return id; }
public String getMessage() { return message; }
}
내가 보기엔 훨씬 깨끗해 보이는데...덜 장황하게.
전 직장에서 열거형 버전을 좀 더 자세히 살펴보았습니다.
public enum Messages {
@Error
@Text("You can''t put a {0} in a {1}")
XYZ00001_CONTAINMENT_NOT_ALLOWED,
...
}
@Error, @Info, @Warning은 클래스 파일에 유지되며 실행 시 사용할 수 있습니다.(메시지 전달을 설명하는 데 도움이 되는 다른 주석도 몇 개 있었습니다.)
@Text는 컴파일 시 주석입니다.
저는 이것을 위해 다음과 같은 주석 프로세서를 작성했습니다.
- 중복된 메시지 번호가 없는지 확인합니다(첫 번째 밑줄 앞 부분).
- 구문 - 메시지 텍스트 확인
- 열거값으로 키 입력된 텍스트를 포함하는 messages.properties 파일을 생성합니다.
에러를 기록하고, 예외로서 랩(필요한 경우)하는 등, 도움이 되는 유틸리티 루틴을 몇개 썼습니다.
오픈소스로 할 수 있게 하려고... - 스콧
java.util을 참조하는 것을 추천합니다.Resource Bundle.I18N을 신경써야 하지만 신경 쓰지 않아도 그만한 가치가 있어요.메시지를 외부화하는 것은 매우 좋은 생각입니다.비즈니스맨에게 보고 싶은 언어를 정확하게 입력할 수 있는 스프레드시트를 제공하는 것이 도움이 된다는 것을 알게 되었습니다.컴파일 시 .properties 파일을 생성하는 Ant 태스크를 작성했습니다.I18N을 하찮게 만듭니다.
봄을 함께 사용한다면 훨씬 더 좋습니다.MessageSource 클래스는 이러한 경우에 유용합니다.
이 특정 문제에 대해 계속 설명하자면, 최종 사용자가 실제 오류 메시지를 자주 잊어버리거나 잘못 읽지만 실제 무슨 일이 일어났는지 알 수 있는 숫자 값을 유지 및 보고할 수 있기 때문에 오류가 표시될 때 숫자 오류 코드를 유용하게 사용할 수 있습니다.
이것을 해결하는 방법은 여러 가지가 있다.인터페이스를 사용하는 것이 좋습니다.
public interface ICode {
/*your preferred code type here, can be int or string or whatever*/ id();
}
public interface IMessage {
ICode code();
}
이제 메시지를 제공하는 임의의 수의 Enum을 정의할 수 있습니다.
public enum DatabaseMessage implements IMessage {
CONNECTION_FAILURE(DatabaseCode.CONNECTION_FAILURE, ...);
}
이제 이러한 항목을 Strings로 변환할 수 있는 몇 가지 옵션이 있습니다.문자열을 코드로 컴파일(주석 또는 열거형 생성자 매개 변수 사용)하거나 구성/프로퍼티 파일, 데이터베이스 테이블 또는 혼합에서 읽을 수 있습니다.후자는 제가 선호하는 접근법입니다.왜냐하면 항상 텍스트로 매우 빨리 변환할 수 있는 메시지가 필요하기 때문입니다(즉,데이터베이스에 접속하거나 설정을 읽는 동안).
유닛 테스트와 리플렉션 프레임워크를 사용하여 각 코드가 어딘가에서 사용되고 있는지, 설정 파일에 예상되는 모든 메시지가 포함되어 있는지 등을 확인하기 위해 인터페이스를 구현하는 모든 유형을 찾고 있습니다.
https://github.com/javaparser/javaparser이나 Eclipse와 같은 Java를 구문 분석할 수 있는 프레임워크를 사용하면 Enum이 사용되는 위치를 확인하고 사용하지 않는 Enum을 찾을 수도 있습니다.
저와 저희 회사의 나머지 팀원들은 에러 코드를 반환하는 대신 예외를 제기하는 것을 선호합니다.에러 코드는, 모든 것을 체크해, 전달해야 하고, 코드의 양이 커지면 코드를 판독할 수 없게 되는 경향이 있습니다.
그런 다음 오류 클래스가 메시지를 정의합니다.
추신: 그리고 실제로 국제화에도 관심이 있습니다!
PPS: 필요에 따라 상승 방법을 재정의하고 로깅, 필터링 등을 추가할 수도 있습니다(적어도 예외 클래스와 친구가 확장/변경 가능한 환경에서는).
조금 늦었지만, 저는 그냥 제 자신을 위한 예쁜 해결책을 찾고 있었어요.다른 종류의 메시지 오류가 있는 경우 나중에 더 자세한 정보와 형식을 지정할 수 있도록 간단한 사용자 지정 메시지 팩토리를 추가할 수 있습니다.
public enum Error {
DATABASE(0, "A database error has occured. "),
DUPLICATE_USER(1, "User already exists. ");
....
private String description = "";
public Error changeDescription(String description) {
this.description = description;
return this;
}
....
}
Error genericError = Error.DATABASE;
Error specific = Error.DUPLICATE_USER.changeDescription("(Call Admin)");
편집: 여기서 열거형을 사용하는 것은 특정 열거형을 영구적으로 변경하기 때문에 약간 위험합니다.클래스로 변경하여 정적 필드를 사용하는 것이 좋을 것 같습니다만, 「==」는 사용할 수 없게 되었습니다.그래서 하지 말아야 할 좋은 예라고 생각합니다(또는 초기화 중에만 실행).
사용.interface
메시지 상수는 일반적으로 좋지 않은 생각이기 때문입니다.내보낸 API의 일부로 클라이언트 프로그램으로 영구적으로 유출됩니다.나중에 클라이언트 프로그래머가 프로그램의 일부로 오류 메시지(퍼블릭)를 해석할지 누가 알겠습니까?
문자열 형식을 변경하면 클라이언트 프로그램이 중단될 수 있으므로 이 기능을 지원하기 위해 영원히 잠깁니다.
오류 코드/메시지 정의에 대한 enum은 i18n 문제가 있지만 여전히 좋은 솔루션입니다.실제로는 코드/메시지가 최종 사용자에게 표시되는 경우와 시스템인테그레이터에게 표시되는 경우가 있습니다.후자의 경우 I18N은 필요 없습니다.나는 웹서비스가 아마도 더 늦은 경우라고 생각한다.
다음 예를 따르십시오.
public enum ErrorCodes {
NO_File("No file found. "),
private ErrorCodes(String value) {
this.errordesc = value;
}
private String errordesc = "";
public String errordesc() {
return errordesc;
}
public void setValue(String errordesc) {
this.errordesc = errordesc;
}
};
코드에서는 다음과 같이 호출합니다.
fileResponse.setErrorCode(ErrorCodes.NO_FILE.errordesc());
PropertyResourceBundle을 사용하여 로케일 오류 코드 리소스를 관리하기 위해 엔터프라이즈 애플리케이션에서 오류 코드를 정의합니다.이것은, 에러 코드의 수가 많고 구조화되어 있는 경우에, 코드를 기술하는 대신에, 에러 코드를 처리하는 최선의 방법입니다(몇개의 에러 코드에서는 유효할 수 있습니다).
PropertyResourceBundle에 대한 자세한 내용은 Java 문서를 참조하십시오.
언급URL : https://stackoverflow.com/questions/446663/best-way-to-define-error-codes-strings-in-java
'programing' 카테고리의 다른 글
최고의 오픈 소스 Java 차트 작성 라이브러리는 무엇입니까?(jfree chart 이외) (0) | 2022.10.02 |
---|---|
웅변/유동어를 사용하여 단일 쿼리에서 여러 행을 삽입하는 방법 (0) | 2022.10.02 |
하나의 디렉토리 PHP에 모든 파일 나열 (0) | 2022.10.02 |
범위 내 모든 변수 가져오기 (0) | 2022.10.02 |
JSON 문자열을 어레이로 변환하는 방법 (0) | 2022.10.02 |