2013-02-26 3 views
4

http://xmlgw.companieshouse.gov.uk/의 응답을 비 정렬 화하고 있습니다. 이것은 마샬로 전송되는 텍스트입니다 :JAXB - 비 정렬 화 필드가 null입니다.

<NameSearch xmlns="http://xmlgw.companieshouse.gov.uk/v1-0/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-0/schema http://xmlgw.companieshouse.gov.uk/v1-0/schema/NameSearch.xsd"> 
    <ContinuationKey>...</ContinuationKey> 
    <RegressionKey>...</RegressionKey> 
    <SearchRows>20</SearchRows> 
    <CoSearchItem> 
    <CompanyName>COMPANY NAME</CompanyName> 
    <CompanyNumber>23546457</CompanyNumber> 
    <DataSet>LIVE</DataSet> 
    <CompanyIndexStatus>DISSOLVED</CompanyIndexStatus> 
    <CompanyDate></CompanyDate> 
    </CoSearchItem> 
    // more CoSearchItem elements 
</NameSearch> 

CoSearchItem의 모델은 다음과 같이이다 :

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "NameSearch", namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema", propOrder = { 
    "continuationKey", 
    "regressionKey", 
    "searchRows", 
    "coSearchItem" 
}) 
@XmlRootElement(name = "NameSearch", namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema") 
public class NameSearch { 

    @XmlElement(name = "ContinuationKey", required = true) 
    protected String continuationKey; 
    @XmlElement(name = "RegressionKey", required = true) 
    protected String regressionKey; 
    @XmlElement(name = "SearchRows", required = true) 
    protected BigInteger searchRows; 
    @XmlElement(name = "CoSearchItem") 
    protected List<CoSearchItem> coSearchItem; 

    // setters and getters 

} 

패키지는이 주석이 있습니다 NameSearch 모델은이 구조를 가지고

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "CoSearchItem", propOrder = { 
    "companyName", 
    "companyNumber", 
    "dataSet", 
    "companyIndexStatus", 
    "companyDate", 
    "searchMatch" 
}) 
public class CoSearchItem { 

    @XmlElement(name = "CompanyName", required = true) 
    protected String companyName; 
    @XmlElement(name = "CompanyNumber", required = true) 
    protected String companyNumber; 
    @XmlElement(name = "DataSet", required = true) 
    protected String dataSet; 
    @XmlElement(name = "CompanyIndexStatus") 
    protected String companyIndexStatus; 
    @XmlElement(name = "CompanyDate") 
    @XmlSchemaType(name = "date") 
    protected XMLGregorianCalendar companyDate; 
    @XmlElement(name = "SearchMatch") 
    protected String searchMatch; 

    // getters and setters 

} 

:

@XmlSchema(namespace = "http://xmlgw.companieshouse.gov.uk/v1-0", elementFormDefault = XmlNsForm.QUALIFIED, // 
    xmlns = { 
     @XmlNs(prefix = "xsi", namespaceURI = "http://www.w3.org/2001/XMLSchema-instance") 
    } 
) 

package uk.gov.companieshouse; 

비 정렬 화는 Document의 첫 번째 Node에서 시작하여 any 항목 목록 안에 있습니다. 그러나 우리는 XML을 구문 분석 할 때 CoSearchItem의 모든 필드가 null로 설정되고 이유를 파악할 수 없습니다.

+1

[this] (http://stackoverflow.com/questions/12747484/jaxb-parses-xml-child-into-null-only-the-attributes-are-set-in-the-object) help? – TheWhiteRabbit

+0

Blaise처럼 @XmlSchema를 가리 킵니다. 잘못된 네임 스페이스 자격을 실현 한 후에 문제를 발견했습니다. – pablisco

답변

13

모델의 네임 스페이스 한정자를 지정하려면 패키지 수준 @XmlSchema annotation을 사용해야합니다.

@XmlSchema(
    namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

이이 당신의 NameSearch 클래스에 @XmlRootElement@XmlType에 네임 스페이스 URI를 지정하는 데 필요하지 않습니다 지정했습니다.


추가 정보

은 비 정렬은 항목의 모든 목록 안에 큰 문서로부터 추출 된 제 노드에서 수행된다.

노드를 만드는 데 사용 된 DOM parer가 네임 스페이스를 인식하는지 확인하십시오.

documentBuilderFactory.setNamespaceAware(true); 
+1

패키지 스키마 주석을 가리켜 주셔서 감사합니다 :) 올바른 것이 아니라는 것이 밝혀졌습니다. – pablisco

+3

이 대답을 모든 필드에 대해 스키마를 설정하는 유일한 올바른 방법으로 변경하는 1.8.0_100 주위에 Java가 변경되었습니다. 그 버전 @XmlRootElement도 작동하기 전에. – Sankozi

2

@Blaise Doughan 덕분에 정답을 찾아 냈습니다.

"http://xmlgw.companieshouse.gov.uk/v1-0" 

그것이 가리키는되어 있어야합니다 : 패키지 네임 스페이스의 자격을보고 한 후 나는 그것이 가리키는 것을 발견이 잘못 있었는지

"http://xmlgw.companieshouse.gov.uk/v1-0/schema" 

확실하지.

+1

그럴 것이다.JAXB가'@XmlElement' 어노테이션의 각각이 잘못된 네임 스페이스에 있다고 생각했기 때문에 디시리얼라이징 할 때 일치하지 않아서 데이터가 바닥에 떨어지고있었습니다. (JAXB는 기본적으로 알려지지 않은 요소를 무시합니다.) –