"동적 열거 형"은 "정적 변수"와 마찬가지로 모순입니까? ;-)Spring에서의 동적 인 열거 형, 또는 Spring을 생성자로부터 멀리 떨어지게하는 방법?
나는 잠시 동안 봄에 몸을 담그고 있었고, 나는 아직 봄 같은 생각을하지 않는다고 생각한다. 나는 타입 - 안전하고 역동적 인 열거를 원한다. 후속 하위 클래스에서 열거 형을 확장하도록 허용하려는 이벤트 또는 오류 코드와 같은 항목에이 패턴을 사용했습니다. "열거 형"을 확장 할 수 없으므로 열거 형 패턴 클래스가 남아 있습니다. 예를 들면 다음과 같습니다.
public class EventType {
private String name;
private static HashMap<String, EventType> cache
= new HashMap<String, EventType>();
protected EventType(String name) {
if (cache.containsKey(name)) {
throw new RuntimeException("EventType '" + name + "' already exists!");
} else {
this.name = name;
cache.put(name, this);
}
}
public static AuditEventType parse(String name) {
return cache.get(name);
}
public static final EventType EVENT_START = new AuditEventType("Start");
public static final EventType EVENT_END = new AuditEventType("End");
public static final EventType EVENT_FAIL = new AuditEventType("Fail");
}
혼합에 Spring을 추가 할 때 문제가 발생합니다. 그것은 문자열 일 뿐이므로 EventType에 "@Embeddable"이라는 주석을 달았으며 클래스를 사용하는 클래스는 해당 멤버를 "@Embedded"으로 주석 처리합니다. 이것은 queryDSL-jpa를 사용하여 질의하는 때가 올 때까지 훌륭하게 작동하는 것처럼 보였다. DSL은 DB 텍스트를 EventType으로 변환하려고 시도합니다. EventType은 문자열과 형식이 일치하지 않습니다. 즉, 나는 말할 수 없습니다 : WHERE EventType = "Start"
. 이러한 필드를 가진 클래스를 String으로 저장하고 getter의 EventType 객체로 파싱하여이를 우아하게 처리하지 않았습니다. 이제는 JPA에 관한 한 일반적인 문자열입니다.
이제 서비스 API에 문제가 있습니다. EventType 매개 변수가있는 메소드가 있습니다. 문제는 JsonRpcServer 클래스가 인스턴스화하여 String을 EventType으로 변환하려고한다는 것입니다. 이것은 물론 "이미 존재합니다!" 예외.
아마도이 두 번째 문제는 @JsonTypeResolver로 해결할 수 있습니다. 그러나이 모든 속임수는 잘못 생각합니다. 이것은 공통적 인 문제 여야하며보다 나은 솔루션이 있어야합니다. Spring에서 이러한 클래스를 처리하는 적절한 방법은 무엇입니까? (bean이 아니고, 정말로, protected 생성자를가집니다).
(코드에서 사용하는 독점 라이브러리에 대한 일부 내용을 생략하고 대신 "X"대신 "X"를 사용해야합니다.)
제안에 감사드립니다, Martin. 'conversionService'는 유망한 것으로 들립니다. UserType에 관해서는, 이미 그것을했습니다. (다시 한번 감사드립니다, StackOverflow!) 결국, 즉각적인 일에 필요한 것은'@JsonDeserize (using = ...)'를 추가하는 것이 었습니다. JSON-RCP 변환이 정적 인스턴스를 다시 인스턴스화하지 못하도록 멋지게 작업했습니다. 일단 기회가 생기면,'converionService'를 시험해보고 스레드를 업데이트 할 것입니다. 다시 한 번 감사드립니다! – Didjit