>

eBay의 LMS (Large Merchant Services)와 협력하고 있으며 계속 오류가 발생합니다 :

org.xml.sax.SAXException:
SimpleDeserializer encountered a child
element, which is NOT expected, in
something it was trying to
deserialize.

시행 착오의많은후에 나는 문제를 추적했다. 작동합니다.

<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
  <Header>
    <Version>583</Version>
    <SiteID>0</SiteID>
  </Header>
  <AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">

이것 (내가 보낸 것)이하지 않는 동안 :

<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
  <Header>
    <Version>583</Version>
    <SiteID>0</SiteID>
  </Header>
  <AddFixedPriceItemRequest>

차이점은 AddFixedPriceItemRequest 의 XML 네임 스페이스 속성입니다. . 현재 모든 XML이 JAXB를 통해 마샬링되고 있으며 파일의 다른 요소에 두 번째 xmlns 속성을 추가하는 가장 좋은 방법은 무엇인지 잘 모르겠습니다.

그게 문제입니다. JAXB의 다른 요소에 xmlns 속성을 어떻게 추가합니까?

package ebay.apis.eblbasecomponents;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AddFixedPriceItemRequestType", propOrder = {
    "item"
})
public class AddFixedPriceItemRequestType
    extends AbstractRequestType
{
    @XmlElement(name = "Item")
    protected ItemType item;
    public ItemType getItem() {
        return item;
    }
    public void setItem(ItemType value) {
        this.item = value;
    }
}

요청에 따라 클래스 정의가 추가되었습니다.

효과가 없도록 위의 클래스를 편집했습니다 :

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "urn:ebay:apis:eBLBaseComponents",
name = "AddFixedPriceItemRequestType", propOrder = {
    "item"
})
public class AddFixedPriceItemRequestType

다음은 BulkDataExchangeRequestsType 의 스 니펫입니다.  수업. 나는 namespace="urn:ebay:apis:eBLBaseComponents" 를 던지려고   @XmlElement 로   AddFixedPriceItemRequest 를 위해  하지만 아무것도하지 않았습니다.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BulkDataExchangeRequestsType", propOrder = {
    "header",
    "addFixedPriceItemRequest"
})
public class BulkDataExchangeRequestsType {
    @XmlElement(name = "Header")
    protected MerchantDataRequestHeaderType header;
    @XmlElement(name = "AddFixedPriceItemRequest")
    protected List<AddFixedPriceItemRequestType> addFixedPriceItemRequest;


  • 답변 # 1

    알 수 있듯이 XML 조각은 의미 상 동일합니다. 와이즈 비즈   xmlns 의 속성  요소는 부모 요소의 네임 스페이스를 암시 적으로 상속하므로 중복됩니다. JAXB는 이것을 알고 있으므로 AddFixedPriceItemRequest 에 네임 스페이스를 추가하지 않아도됩니다.  -필요하지 않습니다.

    이베이 서버가 AddFixedPriceItemRequest 일 때만 작동하는 경우  와이즈 비즈  XML이 있고 XML이 필요하고 스키마가 요구하는 것 이상으로 입력을 요구하고 있습니다. 이것이 사실이라면 (믿기 어렵지만 가능할 경우) JAXB와 같은 Java XML 문서 모델을 사용하면 XML이 XML 인 것으로 가정하기 때문에 어려움을 겪을 것입니다. AddFixedPriceItemRequest 를 얻는 요소에 대한 저수준 방귀  선언은 필요하지 않기 때문에 API에 노출되지 않습니다.

    아무것도 당신을 도와주지 않습니다. 내 접근 방식은 JAXB 모델을 DOM 객체에 마샬링하는 것입니다 ( xmlns 사용)   xmlns 에 전달 )을 누른 다음 DOM을 수동으로 조정하여 DOMResult 를 강제 실행할 수 있는지 확인하십시오.  적절한 장소에서 문서에. 그런 다음 해당 DOM을 XML로 직렬화하여 보낼 수 있습니다.

    이 작업을 수행 할 필요는 없으며, 어딘가에서 다른 일을하고있는 것 같습니다. 이것은 ebay 웹 서비스가 이렇게 망가 졌을 가능성이 높습니다.

    <시간>

    edit : JAXB-to-DOM-to-XML 솔루션보다 약간 덜 다른 제안이 있습니다. 요청 XML이 구조상 합리적인 정적이고 숫자/문자열 값만 변경 한 경우이를 문자열 템플리트로 정의한 다음 런타임시 값을 바꾸고 전송하십시오. 그런 다음 JAXB를 사용하여 결과를 해석 할 수 있습니다. 웹 서비스 thyat이 매우 정확한 네임 스페이스 접두어를 필요로하는 oast 에서이 작업을 수행했습니다 .Java XML 라이브러리를 설득 할 때 설득력이 없었습니다.

  • 답변 # 2

    클래스 주석 사용 시도

    Marshaller
    
    

    또는

    xmlns
    
    

    특정 경우에만 네임 스페이스를 지정하려는 경우 속성 주석

  • 답변 # 3

    생성 된 클래스의 필드에 @XmlType(namespace="urn:ebay:apis:eBLBaseComponents") 가 없는지 확인  주석이 있으면 네임 스페이스 속성이 누락됩니다. 마샬링 된 XML의 모든 요소에 대해 네임 스페이스 접두사를 가져 오려면이 두 개가 있어야합니다.

    @XmlElement(namespace="urn:ebay:apis:eBLBaseComponents")

관련 자료

  • 이전 클래스 인스턴스는 TypeScript에서 빈 객체를 반환합니다
  • 다음 각 변수에 대한 변수 레이블이있는 dta 파일이 있습니다 R로 가져온 후에는이 레이블을 어떻게 볼 수 있습니까?