2017-12-14 2 views
0

Root 요소에 대한 비 정렬 화 결과가 잘못되었습니다. 키를 속성으로 사용하기위한 자체 서브 클래스에 대한 참조를 포함하며 다른 서브 클래스에 대한 참조를가집니다. 저는 MOXy 버전 2.7.0과 jdk8u45를 사용하고 있습니다.서브 클래스로 비 정렬 화 결과가 잘못됨

나는이 같은 루트 요소를 만들 : 잘못된 개체에서이 XML 결과 비 정렬 화

<root name="rootKey"><sub name="subKey"/></root> 

:

Root root = new Root("rootKey", "subKey"); 

마샬링 올바른 XML 출력에 결과를. 결과 객체에는 두 키 이름 모두에 대해 "subKey"가 있습니다. 설치가 잘못되었거나 버그입니까?

는 루트 클래스는 다음과 같습니다

@XmlRootElement(name = "root") 
public class Root { 
    @XmlPath(".") 
    private final Root.Key key; 

    @XmlElement(name = "sub") 
    private final Sub.Key subKey; 

    public Root(String name, String subName) { 
     this.key = new Root.Key(name); 
     this.subKey = new Sub.Key(subName); 
    } 

    private Root() { 
     this(null, null); 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((key == null) ? 0 : key.hashCode()); 
     result = prime * result + ((subKey == null) ? 0 : subKey.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj != null && obj.getClass().equals(this.getClass())) { 
      Root o = (Root)obj; 
      return key.equals(o.key) && subKey.equals(o.subKey); 
     } 
     return false; 
    } 

    @Override 
    public String toString() { 
     return "Root [key=" + key + ", subKey=" + subKey + "]"; 
    } 

    @XmlType(name = "Root.Key") 
    @XmlRootElement 
    public static final class Key { 
     @XmlAttribute 
     private final String name; 

     public Key(String name) { 
      this.name = name; 
     } 

     private Key() { 
      // Constructor for JAXB 
      this(null); 
     } 

     public String getName() { 
      return name; 
     } 

     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + ((name == null) ? 0 : name.hashCode()); 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (obj != null && obj.getClass().equals(this.getClass())) { 
       Key o = (Key)obj; 
       return name.equals(o.name); 
      } 
      return false; 
     } 

     @Override 
     public String toString() { 
      return "Key [name=" + name + "]"; 
     } 
    } 
} 

소위원회 클래스는 다음과 같습니다

@XmlRootElement(name = "sub") 
public class Sub { 
    @XmlType(name = "Sub.Key") 
    @XmlRootElement 
    public static final class Key { 
     @XmlAttribute 
     private final String name; 

     public Key(String name) { 
      this.name = name; 
     } 

     private Key() { 
      // Constructor for JAXB 
      this(null); 
     } 

     public String getName() { 
      return name; 
     } 

     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + ((name == null) ? 0 : name.hashCode()); 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (obj != null && obj.getClass().equals(this.getClass())) { 
       Key o = (Key)obj; 
       return name.equals(o.name); 
      } 
      return false; 
     } 

     @Override 
     public String toString() { 
      return "Key [name=" + name + "]"; 
     } 
    } 
} 

답변

1

이 시도 :

루트 클래스

@XmlRootElement(name = "root") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 
    @XmlAttribute(name = "name") 
    private final Root.Key key; 
    @XmlElement(name = "sub") 
    private final Sub.Key subKey; 

    public Root(String name, String subName) { 
     this.key = new Root.Key(name); 
     this.subKey = new Sub.Key(subName); 
    } 

    private Root() { 
     this(null, null); 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((key == null) ? 0 : key.hashCode()); 
     result = prime * result + ((subKey == null) ? 0 : subKey.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj != null && obj.getClass().equals(this.getClass())) { 
      Root o = (Root)obj; 
      return key.equals(o.key) && subKey.equals(o.subKey); 
     } 
     return false; 
    } 

    @Override 
    public String toString() { 
     return "Root [key=" + key + ", subKey=" + subKey + "]"; 
    } 

    @XmlType(name = "Root.Key") 
    @XmlRootElement 
    public static final class Key { 
     @XmlValue 
     private final String name; 

     public Key(String name) { 
      this.name = name; 
     } 

     public Key() { 
      // Constructor for JAXB 
      this(null); 
     } 

     public String getName() { 
      return name; 
     } 

     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + ((name == null) ? 0 : name.hashCode()); 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (obj != null && obj.getClass().equals(this.getClass())) { 
       Key o = (Key)obj; 
       return name.equals(o.name); 
      } 
      return false; 
     } 

     @Override 
     public String toString() { 
      return "Key [name=" + name + "]"; 
     } 
    } 
} 

그리고 서브를 클래스

@XmlAccessorType(XmlAccessType.FIELD) 
public class Sub { 

    @XmlType(name = "Sub.Key") 
    public static final class Key { 
     @XmlAttribute(name = "name") 
     private final String name; 

     public Key(String name) { 
      this.name = name; 
     } 

     public Key() { 
      // Constructor for JAXB 
      this(null); 
     } 

     public String getName() { 
      return name; 
     } 

     @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + ((name == null) ? 0 : name.hashCode()); 
      return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (obj != null && obj.getClass().equals(this.getClass())) { 
       Key o = (Key)obj; 
       return name.equals(o.name); 
      } 
      return false; 
     } 

     @Override 
     public String toString() { 
      return "Key [name=" + name + "]"; 
     } 
    } 
} 

마샬링/언 마샬링 할 수 있어야합니다.

+0

답변 해 주셔서 감사합니다. 내 실제 구현에서 하위 또한 자체 키에 대한 참조가 있습니다. Sub.name을 XmlValue에서 XmlAttribute로 변경하면 더 이상 사용할 수 없습니다. – Aster

+0

귀하의 의견을 이해할 수 없습니다. 당신은 문법을 바꿀 수 있습니까? 응답 한 지 얼마되지 않았지만 Sub.name에 대한 주석이 변경되지 않았 음을 알았습니다. – mart