Play 2.0에서 Jackson으로 모델 변환시 충돌 문제 Java / Groovy

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 :
, , ,

Leave Comments