2017-10-23 1 views
0

나는 다음과 같은 JAXB 엔티티가 : 유사한 구조로 직렬화JAXB - 크기 단체의 목록에 엔티티를 비 정렬 화하는 방법 1

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = EntityConstants.PARTNER) 
public class FilePartner 
{ 
    @XmlAttribute(name = EntityConstants.IDENTIFIER, required = true) 
    private String identifier; 

    @XmlElement(name = EntityConstants.NAME) 
    private String name; 

    @XmlElement(name = EntityConstants.ROOT_PATH) 
    private String rootPath; 

    ... 
} 

가 :

<file-partner identifier="foo"> 
    <name>bar</name> 
    <root-path>path123</root-path> 
    ... 
</file-partner> 

나는 또한 기업이를

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = EntityConstants.PARTNERS) 
public class FilePartnerList 
{ 

    @XmlElement(name = EntityConstants.PARTNER) 
    private List<FilePartner> partners = new ArrayList<FilePartner>(); 

    public List<FilePartner> getPartners() 
    { 
     return partners; 
    } 

    public void addPartners(List<FilePartner> partners) 
    { 
     this.partners.addAll(partners); 
    } 
} 

으로 직렬화 :

파트너 목록을 나타냅니다
<partners> 
    <file-partner identifier="foo"> 
     ... 
    </file-partner> 
    <file-partner identifier="foo2"> 
     ... 
    </file-partner> 
    ... 
</partners> 

I 즉, 하나의 목록 크기와 FilePartnerList 인스턴스에

<file-partner identifier="foo"> 
     <name>bar</name> 
     <root-path>path123</root-path> 
     ... 
</file-partner> 

의 형태로 XMLS를 직렬화하기 위해 JAXB의 Unmarshaller에 강제 할 수있는 방법을 찾고 있어요 :

JAXBContext context = JAXBContext.newInstance(FilePartner.class, FilePartnerList.class); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
InputStream inputStream = getResourceAsStream(filePartnerAsXml); 
FilePartnerList partnerList = (FilePartnerList) unmarshaller.unmarshal(inputStream); // This SHOULD be unmarshalled to FilePartnerList instead of FilePartner 
assertTrue(partnerList.getPartners().getSize().equals(1)); 

방법 나는 그것을 성취합니까?

답변

0
private List<FilePartner> partners = new ArrayList<FilePartner>(**1**); 

당신은 고정 된 크기의 입력 배열 ....

하지만 난 당신이 그렇게 'maxocurrs = 1'로 그 모델의 XSD를 얻고 싶은 것을 확신을 얻을 것이다 그런 식으로 XSD를 수동으로 수정하는 작업이 끝납니다.

어쨌든 : 왜 목록 크기를 '1'로 고정해야합니까? 단 하나의 자식이있는 단순 노드로 설정하면됩니까? 이 (안된)와 같은 뭔가 : 당신이 하나 parnets 목록 당 하나의 파트너가됩니다

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = EntityConstants.PARTNERS) 
public class FilePartnerList 
{ 

    @XmlElement(name = EntityConstants.PARTNER) 
    private FilePartner partners; 

    public FilePartner getFilePartner() 
    { 
     return partner; 
    } 

    public void setPartner(FilePartner partner) 
    { 
     this.partner = partner; 
    } 
} 

이 방법.

XML은 서비스의 XSD에 텍스트를 포함하고 텍스트에는 최대 크기 1과 노드가있는 목록을 식별 할 수 없습니다.

+0

나는 오해 받았다. 둘 이상의 하위가 포함 된 을 비 정렬 화해야 할 수도 있으므로 FilePartnerList에서 고정 크기를 사용하는 것은 불가능합니다. 필자가 바라는 부분은 하나의 태그가 포함되어있는 XML (par343)을 가지고있는 경우, 크기 1의 FilePartnerList로 비 정렬 화해야합니다. – mdzh

+0

여기를 살펴보십시오. https : //stackoverflow.com/questions/25067873/is-it-possible-to-define-an-attribute-of-an-xml-element-to-be-required-only-if-a 유효한 xsd를 사용하여 그 선택과 xjc와 자바 클래스를 만들 ... – inigoD

관련 문제