2012-06-17 3 views
3

Play에서 일부 조명기 데이터를로드하려고합니다! 1.2.4와 SnakeYAML. 개체 유형은 Map<enum, Integer>입니다. Fixtures.loadModels ("quest.yml")에 오류가 발생했습니다. "Fixture quests.yml을로드 할 수 없습니다. java.lang.String을 java.lang.Enum으로 캐스팅 할 수 없습니다."Map <Enum, Integer>에 YAML 고정 장치로드

코드 나는 내가 @MapKeyEnumerated 주석에 열거 통계의 문자열 값을 사용하도록 지정한,

Constants.java 
public enum STATS { 
     CREATIVITY, ENTHUSIASM, ... 
} 

Quest.java 
@ElementCollection 
@MapKeyEnumerated(EnumType.STRING) 
public Map<Constants.STATS, Integer> reward; 

quest.yml 
Quest(sirlin): 
    reward: 
     CREATIVITY: 1 

당신이 볼 수 있듯이

을 snippets-. 이 올바르게 작동하도록 yml 정의 형식을 변경하는 방법을 잘 모르겠습니다. 어떤 아이디어?

+0

[이 테스트 사례] (http://code.google.com/p/snakeyaml/source/browse/src/test/java/org/yaml/snakeyaml/EnumTest.java?name=v1)를 발견했습니다. 0.1 & r = 2ce78be1172188f4ea505cbd7b947a30c6a02e96),하지만 그들을 사용할 때 'exception = Class not found : models.EnumClass' 오류가 발생합니다. 나는 같은 문제를 안고있다 ^.^ – Chango

답변

1

음, 나는 1.2.4 버전의 게임에 대한 '해결책'을 발견했습니다.하지만보기 흉한 일이지만 작동합니다.

내가 찾은 첫 번째 것은

은 그것이 당신이 그것을해야하는 방법을 보여줍니다, this test case했다 : 키와 같은 열거와지도를 줄 것이다

map: 
    !!org.pacakge.EnumClass 'CLUBS': 1 
    !!org.pacakge.EnumClass 'DIAMONDS': 2 

.

그러나이 예외주기 때문에 작동하지 않습니다 :

Can't construct a java object for tag:yaml.org,2002:models.Plazos; exception=Class not found: org.pacakge.EnumClass 

을하지만 내가 thisthis을 발견했다. 문제는 Yaml 파서 (snakeyaml)가 .yml 파일을 구문 분석하기 위해 자체 ClassLoader를 생성하기 때문에 발생합니다. 플레이 구조! 프레임 워크는 자체 ClassLoader를 사용합니다. 이 솔루션은 물론, 그 때문에 내 솔루션 것이었다는 play.test.Fixtures 클래스 내부에서 수행되고,이

Yaml y = new Yaml(new CustomClassLoaderConstructor(playClassLoader)); 

Yaml y = new Yaml(); 

을 대체 할 수 있지만 것인가? 음, 프로젝트에 클래스를 복사 loadModels 방법이 라인을 교체 :

Yaml yaml = new Yaml(); 

을이 하나 :

Yaml yaml = new Yaml(new CustomClassLoaderConstructor(Play.classloader)); 

을 그리고 그것을 작동하게됩니다.

+0

흠, 나는 똑같은 문제가있어서 같은 링크를 찾았지만 2.0으로 해봤지만 같은 것을 계속 얻는다. 클래스가 예외를 찾지 못했다 : Yaml yaml = new Yaml (새로운 CustomClassLoaderConstructor (Play.application(). classloader())); 게임에서 당신에게 효과가 있습니까? 2.0.2? – baraber

+0

아니, 미안해. 대답에 넣지 않았어.이게 나를 위해 일했어. 1.2.4. 나는 지금 대답을 편집 할 것이다. – Chango