2013-08-02 2 views
1

클래스 :Jackson의 필드 형식보다 getter가 반환하는 다른 형식입니다. 설정하는지도를 변환하는 방법?

public class Contact implements ContactInterface { 
    private Set<ContactInfoInterface> contactInfo; 

    public Map<String, ContactInfo> getContactInfo() { 
     // create maps from contactInfo set 
     return map; 
    } 
    //no setter 
} 

public class ContactInfo implements ContactInfoInterface { 
    private String contactInfoValue; 

    public String getContactInfoValue { 
     return this.contactInfoValue; 
    } 
    public void setContactInfoValue(String value) { 
     this.contactInfoValue = value; 
    } 
} 

잭슨 믹스 인은 :

public abstract class ContactMixIn implements ContactInterface { 

    @JsonProperty 
    public abstract Map<String, ContactInfo> getContactInfo(); 
} 

나는 잭슨에 의해 생성 된 역 직렬화 된 JSON에 문제가 있습니다. 직렬화의 결과에서 나는 mapInfo를 가지고있는 json을 얻었다. (이것은 기본적으로 getter에서 리턴 된 타입으로 가지고있다.) 하지만 그것을 deserialize 할 때 잭슨은 contactInfo를 인스턴스화하려고 시도하고 있습니다. (사실 contactInfo가 집합이기도합니다). 물론 Jackson은 json 값을 설정하기 위해 매핑 할 수없고 이상한 예외가 발생합니다. 그래서 내 질문에 ContactInfoInterface 집합을 얻으려면이 경우 매핑을 deserialize 할 수 있습니까?

세 번째 파트 클래스가 아니기 때문에 세터 나 다른 것들을 추가 할 수 있습니다. 그러나 옵션이 있다면 나는 그렇게하지 않을 것입니다. 도움

+0

가장 간단한 방법으로 contactInfo 세트에 새로운 기본 getter를 추가 할 수 있을지 궁금합니다. public Set getContactInfo() {}하지만 ContactInterface에 추가하지 말고 ContactInterface를 구현하는 대신 Contact 클래스를 확장하도록 ContactMixIn을 변경하지 마십시오. . 어떻게 생각해? – user1802311

답변

0

에 대한

감사는 MapSet을 변환 할 수는 없습니다. SetCollection의 확장자이며 Map은 완전히 다른 개체입니다. ContactInfoInterface에 필요한 정보가 포함되어있는 경우 을 수동으로 빌드하면Map입니다. 하지만 Map 형태로 Set을 전달하려고 시도하면 작동하지 않습니다.

+0

당신이 나를 이해할 것 같지 않아요. 괜찮습니다. 물론 나는 수동으로 set에서 map을 생성하고 getter 메소드는 그 map을 반환하고 json으로 변환한다. 그리고 deserialize하는 동안 Jackson은 json에서 가지고있는 것을 세트로하려고합니다. 그리고 ContactInfo의 인스턴스가 적절하게 인스턴스화되도록 Contact 인스턴스를 직렬화 및 비 직렬화 할 수 있는지 궁금합니다. – user1802311

+0

직렬화, 올바르게 기억한다면 개인 필드의 유형을 알고 있습니다. 이것은 필드의 실제 유형에 해당하는 getter와 setter가 필요함을 의미합니다. – StormeHawke

0

귀하의 질문을 완전히 이해하고 있는지 확신 할 수 없지만, 도움이된다면 Jackson이 예상하는 유형은 직렬화 및 비 직렬화를 위해 동일 할 필요는 없습니다. 그러나 연관된 이름은 특정 사용 사례와 일치해야합니다. 사용하고자하는 JSON을 보는 것이 도움이됩니다. 일을 직렬화 할 때, 잭슨의 모습이 무엇인지 :

그래서

  • 게터 하나는 (콩 getName() 같은 명명 규칙에서 중 ->name, @JsonProperty 나) 특정 이름이있는 경우, 그것은 것입니다
  • 필드 : getter가없고 public 또는 visible setter (public 또는 @JsonProperty으로 주석 됨)와 일치하는 필드는 사용됩니다. 유형은 필드 유형입니다.

직렬화를 들어, 대신이 될 것입니다 :

  • 세터 : 프로퍼티의 이름을 찾는에 대한 게터 유사; type은 첫 번째 인수의 유형입니다.
  • 필드 :. 더 세터가 존재하지 않는 경우, 필드 게터에 의해 "당겨"수를 제외하고 위와 볼 (같은 규칙 경우, 사용되는 필드는 하나 개의 유형이 있기 때문에,이 조합을 사용할 필요가

또한 getter와 setter (또는 getter + field 또는 setter + field)는 실제로 하나의 속성 만 필요하고 다른 것들은 변환에만 필요하면 특정 속성이나 접근자를 숨기려면 @JsonIgnore을 사용하십시오. "split"주석을 사용할 수도 있습니다. getter는 @JsonProperty (사용되므로)이지만 setter 및 field는 @JsonIgnore입니다.

관련 문제