2013-03-11 6 views
0

"동적 열거 형"은 "정적 변수"와 마찬가지로 모순입니까? ;-)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"를 사용해야합니다.)

답변

1

스프링 측은 conversionService를 살펴보십시오. 이렇게하면 사용자 지정 변환기를 등록 할 수 있습니다. 따라서 EventTypeToStringConverter 및 StringToEventTypeConverter를 등록 할 수 있어야합니다. 이벤트 유형에서 /에서 해결할 "전체"제어 권한을 갖습니다.

Hibernate 측은 Hibernate가 EventType에 대해 특정 UserType을 사용하는 솔루션 일 수 있으므로 Hibernate는 이것을 열 값으로 저장하고 읽을 수있다. (나는 당신이 필요로하는 것입니다) 나는 엔티티 자체로 모델링하고 싶지 않은 각 엔티티에 대한 상태와 비슷한 요구 사항을 가졌습니다. 쿼리에서 문자열 매개 변수를 직접 사용할 수 없었지만 구현할 수있는 인터페이스가 많습니다. 매개 변수에 문자열 인식을 허용하는 인터페이스가 많습니다.

+0

제안에 감사드립니다, Martin. 'conversionService'는 유망한 것으로 들립니다. UserType에 관해서는, 이미 그것을했습니다. (다시 한번 감사드립니다, StackOverflow!) 결국, 즉각적인 일에 필요한 것은'@JsonDeserize (using = ...)'를 추가하는 것이 었습니다. JSON-RCP 변환이 정적 인스턴스를 다시 인스턴스화하지 못하도록 멋지게 작업했습니다. 일단 기회가 생기면,'converionService'를 시험해보고 스레드를 업데이트 할 것입니다. 다시 한 번 감사드립니다! – Didjit