2012-06-07 2 views
6

주석이없는 클래스를 직렬화하기 위해 Jackson 2.0 mixins을 실험하고있었습니다.기본 Jackson Mixin을 사용할 수 없습니다.

아래의 간단한 소스 코드. getters/setter를 사용하지는 않지만 믹스를 계속 사용할 수있는 것 같습니다. according to some fairly sketchy documentation. 나는 주요 실행하면

public class NoAnnotation { 
    private Date created; 
    private String name; 
    private int id; 
    private List<URL> urls = new ArrayList(); 

    // make one with some data in it for the test 
    static NoAnnotation make() { 
     NoAnnotation na= new NoAnnotation(); 
     na.created = new Date(); 
     na.name = "FooBear"; 
     na.id = 23456; 

     try { 
     na.urls.add(new URL("http://www.eclipse.org/eclipselink/moxy.php")); 
     na.urls.add(new URL("http://jaxb.java.net")); 
     } catch (MalformedURLException e) { 
     throw new RuntimeException(e); 
     } 
     return na; 
    } 

    // my Mixin "Class" 
    static class JacksonMixIn { 
     JacksonMixIn(@JsonProperty("created") Date created, 
        @JsonProperty("name") String name, 
        @JsonProperty("id") int id, 
        @JsonProperty("urls") List<URL> urls) 
     { /* do nothing */ } 
    } 

    // test code 
    public static void main(String[] args) throws Exception { 
     NoAnnotation na = NoAnnotation.make(); 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.addMixInAnnotations(NoAnnotation.class, JacksonMixIn.class); 
     String jsonText = objectMapper.writeValueAsString(na); 
     System.out.println(jsonText); 
    } 
} 

나는 내가 어딘가에 단계 기본 "setThis"을 떠납니다 같은데요

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class com.flyingspaniel.so.NoAnnotation and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS)) 
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:51) 
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:25) 
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:108) 
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2407) 
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:1983) 
    at com.flyingspaniel.so.NoAnnotation.main(NoAnnotation.java:49) 

를 얻을 수 있지만, 무엇을 알지 못한다. 감사!

편집 : 나는 예외의 지침을 따라 줄

objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 

나는 더 이상 예외가 없습니다를 추가 할 수 있지만 결과는 빈 JSON 문자열 "{}"인 경우.

EDIT2 : 필드를 공용으로 만들면 작동하지만 합리적인 개체 디자인이 아닙니다.

답변

5

나는 그것을 알아 냈다. 당신이에 주석 믹스를 사용하려는 경우 당신은 또한 Visibility.PROTECTED_AND_PUBLIC

6

을 사용할 수, 보호 분야에 대한

objectMapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(Visibility.ANY)); 

: 당신이 개인 필드에 액세스하려면 다음 줄을 추가하여 가시성과 재생해야 를 선언하는 올바른 방법은 다음과 같습니다.

당신은 단순히의 혼합에서 제외/포함 직렬화 필드를 제어 할 수 있습니다 이런 식으로
static class JacksonMixIn { 
    @JsonProperty Date created; 
    @JsonProperty String name; 
    @JsonProperty int id; 
    @JsonProperty List<URL> urls; 
} 

관련 문제