Привязка Jaxb со списком, возвращенным в ответе веб-службы

Я разрабатываю клиент jax-ws, я пытаюсь обработать ArrayList, возвращенный в качестве ответа, но у меня всегда был пустой список.

Возвращаемый список НЕ пуст, я уверен, что провайдер WebService возвращает данные в этом списке, я проверил это с помощью SoapUI.

создаются файлы, связанные с клиентом:

 @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ArrayOfFact", propOrder = {
    "item"
})
public class ArrayOfFact {

    protected List<Fact> item;
 public List<Fact> getItem() {
        if (item == null) {
            item = new ArrayList<Fact>();
        }
        return this.item;
    }

}

Класс ArrayOfFacts, сгенерированный wsimport, это тот же класс, сгенерированный ранее.

Ответ XML, который я получаю в SOAPUI:

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ReleveResponse xmlns="http://www.test.ma/webservices/WSTestServe/">
         <ReleveResult>
            <ConversationId>conId</ConversationId>
            <Status>
               <WSStatus>OK</WSStatus>
               <WSCode>OK</WSCode>
               <WSMessage>Le traitement s’est bien déroulé!</WSMessage>
            </Status>
            <myReleveInfo>
               <NomCli>El Karkouri youssef</NomCli>
               <NbrImp>7</NbrImp>
               <Facture>
                  <Fact>
                     <RefImp>FACT-124</RefImp>
                     <MntImp>230</MntImp>
                     <LibImp>label 1</LibImp>
                     <FlgPaiObl>1</FlgPaiObl>
                  </Fact>
                  <Fact>
                     <RefImp>FACT-125</RefImp>
                     <MntImp>260</MntImp>
                     <LibImp>label 0</LibImp>
                     <FlgPaiObl>0</FlgPaiObl>
                  </Fact>
                  <Fact>
                     <RefImp>FACT-126</RefImp>
                     <MntImp>360</MntImp>
                     <LibImp>label 2</LibImp>
                     <FlgPaiObl>0</FlgPaiObl>
                  </Fact>
                  <Fact>
                     <RefImp>FACT-127</RefImp>
                     <MntImp>236</MntImp>
                     <LibImp>label 3</LibImp>
                     <FlgPaiObl>0</FlgPaiObl>
                  </Fact>
                  <Fact>
                     <RefImp>FACT-128</RefImp>
                     <MntImp>2310</MntImp>
                     <LibImp>label 4</LibImp>
                     <FlgPaiObl>1</FlgPaiObl>
                  </Fact>
                  <Fact>
                     <RefImp>FACT-129</RefImp>
                     <MntImp>2450</MntImp>
                     <LibImp>label 0</LibImp>
                     <FlgPaiObl>1</FlgPaiObl>
                  </Fact>
                  <Fact>
                     <RefImp>FACT-167</RefImp>
                     <MntImp>2380</MntImp>
                     <LibImp>label 1125</LibImp>
                     <FlgPaiObl>0</FlgPaiObl>
                  </Fact>
               </Facture>
            </myReleveInfo>
         </ReleveResult>
      </ReleveResponse>
   </soapenv:Body>
</soapenv:Envelope>

Ответ JSON, который я получаю, когда тестирую клиент jax-ws:

{
"status": "OK",
"language": "en",
"data": {
    "conversationId": {
        "name": "{http://www.test.ma/webservices/WSTestServe/}ConversationId",
        "declaredType": "java.lang.String",
        "scope": "ma.comp.company.client.testserv.AbstractBean",
        "value": "conId",
        "nil": false,
        "globalScope": false,
        "typeSubstituted": false
    },
    "status": {
        "name": "{http://www.test.ma/webservices/WSTestServe/}Status",
        "declaredType": "ma.comp.company.client.testserv.StatusBeanOut",
        "scope": "ma.comp.company.client.testserv.AbstractBeanOutOfReleveInfo",
        "value": {
            "wsstatus": "OK",
            "wscode": "OK",
            "wsmessage": "Le traitement s’est bien déroulé!"
        },
        "nil": false,
        "globalScope": false,
        "typeSubstituted": false
    },
    "myReleveInfo": {
        "nomCli": {
            "name": "{http://www.test.ma/webservices/WSTestServe/}NomCli",
            "declaredType": "java.lang.String",
            "scope": "ma.comp.company.client.testserv.ReleveInfo",
            "value": "El Karkouri youssef",
            "nil": false,
            "globalScope": false,
            "typeSubstituted": false
        },
        "nbrImp": {
            "name": "{http://www.test.ma/webservices/WSTestServe/}NbrImp",
            "declaredType": "java.lang.String",
            "scope": "ma.comp.company.client.testserv.ReleveInfo",
            "value": "7",
            "nil": false,
            "globalScope": false,
            "typeSubstituted": false
        },
        "facture": {
            "name": "{http://www.test.ma/webservices/WSTestServe/}Facture",
            "declaredType": "ma.comp.company.client.testserv.ArrayOfFact",
            "scope": "ma.comp.company.client.testserv.ReleveInfo",
            "value": {
                "item": []
            },
            "nil": false,
            "globalScope": false,
            "typeSubstituted": false
        }
    }
},
"message": null

}

Класс фактов:

    @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Fact", propOrder = {
    "refImp",
    "mntImp",
    "libImp",
    "flgPaiObl"
})
public class Fact {

    @XmlElementRef(name = "RefImp", namespace = "http://www.test.ma/webservices/WSTesServe/", type = JAXBElement.class, required = false)
    protected JAXBElement<String> refImp;
    @XmlElementRef(name = "MntImp", namespace = "http://www.test.ma/webservices/WSTesServe/", type = JAXBElement.class, required = false)
    protected JAXBElement<String> mntImp;
    @XmlElementRef(name = "LibImp", namespace = "http://www.test.ma/webservices/WSTesServe/", type = JAXBElement.class, required = false)
    protected JAXBElement<String> libImp;
    @XmlElementRef(name = "FlgPaiObl", namespace = "http://www.test.ma/webservices/WSTesServe/", type = JAXBElement.class, required = false)
    protected JAXBElement<String> flgPaiObl;

    // Getters and Setters

}

person Youssefo    schedule 21.07.2018    source источник
comment
есть ли причина, по которой вы не используете wsimport?   -  person diedu    schedule 24.07.2018
comment
Не знаю, я новичок в WS SOAP. у них одинаковая роль?   -  person Youssefo    schedule 25.07.2018
comment
Я только что протестировал wsimport, и у меня возникла та же проблема. всегда список пустой :(   -  person Youssefo    schedule 25.07.2018
comment
Проверьте с помощью сниффера, что запрос, который вы отправляете с клиентом, такой же, как и тот, который вы отправляете через soapui, возможно, вам не хватает какого-то параметра, также было бы полезно опубликовать класс arrayoffacts, сгенерированный wsimport и xml ответ, который вы получаете в soapui   -  person diedu    schedule 25.07.2018
comment
запросы одинаковы, и я добавил к вопросу ответы (SOAPUI и клиент)   -  person Youssefo    schedule 25.07.2018
comment
Почему этот ответ в json?   -  person diedu    schedule 26.07.2018
comment
Потому что я разрабатываю REST API, который вызывает клиента и возвращает ответ в json.   -  person Youssefo    schedule 26.07.2018
comment
вы найдете тестовый класс, который я добавил к вопросу   -  person Youssefo    schedule 26.07.2018
comment
Вы читали это? stackoverflow.com/questions/3601113/jax-ws-return -empty-lists похоже на ту же проблему   -  person diedu    schedule 26.07.2018
comment
Проверьте сгенерированный класс Fact, возможно, он не соответствует xml и препятствует добавлению элемента в список.   -  person diedu    schedule 26.07.2018
comment
Как использовать PayloadValidatingInterceptor? Сгенерированный факт и XML имеют одинаковые свойства, я добавил их в вопрос.   -  person Youssefo    schedule 26.07.2018
comment
Я нашел это, попробуйте последний ответ coderanch.com/t/ 650899/java/Jaxb-Binding-List-returned-web, но в любом случае проблема связана с привязкой, поэтому вам следует искать способ проверить ее правильность, выполнив маршалинг вручную и, возможно, проверив процесс через отладчик и войдите в код парсера, это то, чем я могу помочь, извините, у меня тоже мало опыта   -  person diedu    schedule 26.07.2018
comment
Благодарю за помощь, вы правы проблема именно в привязке. Я исправил это, добавив объявление элемента xml в класс ObjectFactory, сгенерированное wsimport.   -  person Youssefo    schedule 26.07.2018


Ответы (1)


Я исправил это, добавив объявление элемента xml в класс ObjectFactory, сгенерированное wsimport.

@XmlElementDecl(namespace = "http://www.test.ma/webservices/WSTestServe/", name = "Fact", scope = ArrayOfFact.class)
public JAXBElement<Fact> createArrayOfFactItem(Fact value) {
    return new JAXBElement<Fact>(_ReleveInfoFact_QNAME, Fact.class, ArrayOfFact.class, value);
}

И список предметов должен быть аннотирован:

@XmlElementRef(name = "Fact", namespace = "http://www.test.ma/webservices/WSTestServe/", type = JAXBElement.class, required = false)
protected List<Fact> item;
person Youssefo    schedule 26.07.2018