2017-01-19 1 views
0

필자는 XML 스키마가 매우 복잡하며, hyperjaxb3를 사용하여 주석이있는 pojo를 생성합니다. 부모 개체가 있고 8-9 개의 자식이 될 수있는 자식 개체의 값을 확인하려는 경우가 있습니다. 어쨌든 jaxb 또는 다른 도구를 사용하여 jaxb 주석을 기반으로 특정 클래스의 하위 객체 목록을 가져오고 있습니까?jaxb 주석을 사용하여 객체를 비 정렬화한 후에 객체를 탐색 할 수 있습니까?

모든 자식을 클래스의 인스턴스로 검색하는 재귀 함수를 작성할 수는 있지만 이상적이지는 않습니다. 모든 조언을 주시면 감사하겠습니다. (jdereg의 java-util 예를 들어) 이미 거기에 몇 가지가있다, 그리고 JAXBIntrospector 당신을위한 XmlRootElement 주석 객체를 찾을 수 -

답변

0

당신은 오브젝트 트리를 직접 걸을 수있는 코드를 작성할 필요가 없습니다. 다른 주석을 찾는 경우에는 약간의 작업이 필요하지만 많지는 않습니다. 예를 들어

:

public static void main(String[] args) throws JAXBException { 
    JAXBContext jc = JAXBContext.newInstance(Foo.class); 
    JAXBIntrospector is = jc.createJAXBIntrospector(); 

    // Found objects 
    List<Foo.Bar> bars = new ArrayList<>(); 

    // Object name to look for 
    QName barName = new QName("", "bar"); 

    // Unmarshalled root object to introspect 
    Foo target = new Foo(new Foo.Bar()); 

    // Walk the object graph looking for "bar" elements 
    Traverser.traverse(target, o -> { 
     if (barName.equals(is.getElementName(o))) { 
      bars.add((Foo.Bar) JAXBIntrospector.getValue(o)); 
     } 
    }); 

    System.out.println(bars); 
} 

// 
// Some test objects 
// 

@XmlRootElement(name = "foo") 
public class Foo { 
    private Bar bar; 

    public Foo() { } 

    public Foo(Bar bar) { 
     this.bar = bar; 
    } 

    @XmlElement(name="bar") 
    public Bar getBar() { 
     return bar; 
    } 

    public void setBar(Bar bar) { 
     this.bar = bar; 
    } 

    @XmlRootElement(name="bar") 
    public static class Bar { 
     String name = "kate"; 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return "Bar{name='" + name + '\'' + '}'; 
     } 
    } 
} 
관련 문제