Play 2.0에서 Jackson으로 모델 변환시 충돌 문제 Java / Groovy
2012.07.21 06:25 EDIT
Play Framework 2.0에서 모델로 자바빈을 만들고 이를 Json으로 변환하는 중에 아래와 같은 에러를 마주칠 때가 있다.
Caused by: org.codehaus.jackson.map.JsonMappingException: Conflicting getter definitions for property "allowMembersToModify": models.Article#getAllowMembersToModify(0 params) vs models.Article#isAllowMembersToModify(0 params) (through reference chain: java.util.ArrayList[0]) at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(StdSerializerProvider.java:740) ~[jackson-mapper-asl.jar:1.9.7] at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(StdSerializerProvider.java:344) ~[jackson-mapper-asl.jar:1.9.7] at org.codehaus.jackson.map.ser.impl.PropertySerializerMap.findAndAddSerializer(PropertySerializerMap.java:39) ~[jackson-mapper-asl.jar:1.9.7]
해당 자바 빈의 코드는 아래와 같다.
public class Article extends Model { // -- 생략 private boolean allowMembersToModify = false; public boolean isAllowMembersToModify() { return allowMembersToModify; } public void setAllowMembersToModify(boolean allowMembersToModify) { this.allowMembersToModify = allowMembersToModify; } // -- 생략 }
에러메시지를 보면 getAllowMembersToModify와 isAllowMembersToModify 중에 어느 것이 이 프로퍼티의 getter인지를 알 수 없다고 하는데, 자바 코드에는 is_ 외에 get_으로 시작하는 getter는 존재하지 않는다. 어떻게 된 것일까? 이는 플레이 프레임웍이 모델에 대하여 자동으로 getter를 생성하기 때문에 발생하는 일이다.
Play has been designed to generate getter/setter automatically, to ensure compatibility with libraries that expect them to be available at runtime (ORM, Databinder, JSON Binder, etc). If Play detects any user-written getter/setter in the Model, it will not generate getter/setter in order to avoid any conflict.
Play Framework - Using the Ebean ORM
따라서 플레이 프레임웍이 is_ 형식의 getter를 인식하도록 수정되는 것이 옳겠지만, 그 전에는 문제의 getter를 get_ 으로 변경하거나, Jackson 라이브러리에서 무조건 get_ 형식의 getter만 사용하도록 옵션을 주어 해결할 수 있다.
public static String toJsonString(final Object data) { ObjectMapper mapper = new ObjectMapper(); mapper.configure( SerializationConfig.Feature.AUTO_DETECT_IS_GETTERS, false); return mapper.writeValueAsString(data); }
- Tag :
- Java, Play Framework, Jackson, Json