2017-10-27 3 views
1

POJO를 XML로 쉽게 변환하려고하지만 클래스 필드 속성에 문제가 있습니다.JaXB를 사용하는 클래스 필드에 대한 속성

내가 클래스

@XmlRootElement(name = "cat") 
public class Category{ 
    List<Integer> list; 

    public List<Integer> getList() { 
     return list; 
    } 

    @XmlElementWrapper(name = "displayTexts") 
    @XmlElement(name = "displayText") 
    public void setList(List<Integer> list) { 
     this.list = list; 
    } 


} 

<cat> 
     <displayTexts> 
      <displayText language="en">12</displayText> 
      <displayText language="en">23</displayText> 
     </displayTexts> 
    </cat> 

그리고

다음과 같은 XML 파일이 어떻게 위에서 언급 한 XML을 생성합니다 어댑터를 쓸 수 생각해?

오른쪽 지금은 XML을 아래와 같이 뭔가를 생성합니다 ::

<cat> 
     <displayTexts> 
      <displayText>12</displayText> 
      <displayText>23</displayText> 
     </displayTexts> 
    </cat> 

참고 : 나는 뜸을 사용할 수 없습니다입니다. 그리고 나는 다른 수업을 작성함으로써 이것을 달성 할 수 있음을 압니다. 문제는 모든 클래스 필드에 대해이 특성을 일반화 할 수 있도록 어댑터를 작성할 수 있는가입니다.

답변

0

DisplayText와 그 속성에 대한 값을 사용하는 정수 대신 클래스를 사용하지만 새 클래스없이 달성하려는 경우에도 displayList에 @XmlAnyElement를 사용하여 다음과 같이 줄 수 있습니다. 직접 "XML"을 작성하는 것입니다.

import java.util.Arrays; 
import java.util.List; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.annotation.XmlAnyElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

@XmlRootElement(name = "cat") 
public class Category { 

    List<Integer> list; 

    @XmlAnyElement() 
    @XmlJavaTypeAdapter(MyIntegerAdapter.class) 
    public List<Integer> getList() { 
     return list; 
    } 
    //@XmlElement(name = "displayText") 

    public void setList(List<Integer> list) { 
     this.list = list; 
    } 

    public static void main(String[] args) throws Exception { 
     Category bx = new Category(); 

     List<Integer> lists = Arrays.asList(121, 212); 
     bx.setList(lists); 

     JAXBContext jc = JAXBContext.newInstance(Category.class); 
     MyIntegerAdapter adapter = new MyIntegerAdapter(); 
     Marshaller marrshaller = jc.createMarshaller(); 
     marrshaller.setAdapter(adapter); 
     marrshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

     marrshaller.marshal(bx, System.out); 
    } 
} 

class MyIntegerAdapter extends XmlAdapter<Element, List<Integer>> { 

    private DocumentBuilder documentBuilder; 

    public MyIntegerAdapter() { 
    } 

    private DocumentBuilder getDocumentBuilder() throws Exception { 
     // Lazy load the DocumentBuilder as it is not used for unmarshalling. 
     if (null == documentBuilder) { 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      documentBuilder = dbf.newDocumentBuilder(); 
     } 
     return documentBuilder; 
    } 

    @Override 
    public Element marshal(List<Integer> lists) throws Exception { 
     if (null == lists) { 
      return null; 
     } 
     Document document = getDocumentBuilder().newDocument(); 
     Element element = document.createElement("displayTexts"); 
     for (int value : lists) { 
      Element displayText = document.createElement("displayText"); 
      System.out.println("value.." + value); 
      displayText.setTextContent(value + ""); 
      displayText.setAttribute("Lang", "en"); 
      element.appendChild(displayText); 
     } 
     return element; 
    } 

    @Override 
    public List<Integer> unmarshal(Element v) throws Exception { 
     //TODO 
     throw new UnsupportedOperationException(); 

    } 
} 
+0

답장을 보내 주셔서 감사합니다. 별도의 수업을 만드는 것이 더 좋습니다. 어쨌든 노력을 감사하십시오. – azhar

+0

그것은 현명한 결정이며 더 나은 접근 방법입니다. – Optional

관련 문제