javax.xml.ws.soap.SOAPFaultException:解组错误

时间:2018-10-16 11:50:53

标签: java webservice-client

从网络服务调用服务时遇到问题。 我无法确定收到的以下解组错误。请帮忙。我查看了过去的帖子,但不知道发生了什么,因为错误描述非常笼统。

要从WSDL生成Java客户端代码,请使用: wsimport -b binding.xml service.wsdl

其中binding.xml是:

<bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="http://localhost:8080/services/service?wsdl"
xmlns="http://java.sun.com/xml/ns/jaxws">
    <!-- Disable default wrapper style -->
    <enableWrapperStyle>false</enableWrapperStyle>
</bindings>

(不幸的是,由于消息正文大小的限制,我无法附加我的WSDL)

因此,在生成客户端并实现对服务的调用之后,我获得了以下错误消息:     javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156) at com.sun.proxy.$Proxy151.protocolInsert(Unknown Source) ...

下面是一段代码:

import javax.xml.ws.BindingProvider;
//other import
public class ProtocolHandler{
....
    private ProtocolloServicePortType initServiceProtocol() throws                                       Exception
    {
        // Init client WS
        ProtocolloService invoiceProcolWs = new ProtocolloService();
        ProtocolloServicePortType port = invoiceProcolWs.getProtocollo();
        BindingProvider bp = (BindingProvider) port;

        // Setting endopoint
        bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, getUrl());

        return port;
    }

    private void createProtocol(){
        try{
           //Initialize service
           ProtocolloServicePortType protocolService = initServiceProtocol();
           //Create a request
           ProtocolInsertRequest request = prepareRequest();
           //Call the method service protocolInsert
           ProtocolResponse response = protocolService.protocolInsert(request);
        }catch(Exception e){
             //manage Exception
        }

    }
}

我使用Eclipse Jee Neon JDK 1.7.0_25。

我的项目使用了几个库:这些错误可能与不兼容问题相关吗?

有jaxbw-plugin-1.0.jar,jaxb-xjc-2.0.jar,jaxb-impl-2.0.jar,jaxb-api-2.0.jar,javaee-api-6.0.jar。

更新18/10/2018

我发现了问题所在。使用SOAPHandler时,我已经注意到,当我对它们进行价值评估时,我的请求中缺少了日期值(调试时,我看到我的请求中的每个日期都被定价了)。

<ns5:protocolInsert xmlns="http://insielmercato.it/protocollo-ws/data/common" xmlns:ns2="http://insielmercato.it/protocollo-ws/data/anagrafic" xmlns:ns3="http://insielmercato.it/protocollo-ws/data/filing" xmlns:ns4="http://insielmercato.it/protocollo-ws/data/protocol" xmlns:ns5="http://insielmercato.it/protocollo-ws/services/protocolloService">
<ns4:user>
    <code>USER</code>
    <password>PSWD</password>
</ns4:user>
<ns4:operatingOfficeCode>OFFICE</ns4:operatingOfficeCode>
<ns4:officeCode>GEN</ns4:officeCode>
<ns4:registerCode>GEN</ns4:registerCode>
<ns4:direction>A</ns4:direction>
<ns4:sequenceCode>SEQUENCE</ns4:sequenceCode>
<ns4:subjectDocument>Test protocollazione notifica fattura passiva</ns4:subjectDocument>
<ns4:subjectProtocol>PROTOCOLLAZIONE DOC. PROVA000002</ns4:subjectProtocol>
<ns4:receptionSendingDate/>
<ns4:documentDetails>
    <number>PROVA000002</number>
    <date/>
    <year>2018</year>
    <documentTypeCode>FAT</documentTypeCode>
</ns4:documentDetails>
<ns4:senderList>
    <ns4:sender>
        <code>SENDER</code>
    </ns4:sender>
</ns4:senderList>

如您所见,标记<ns4:receptionSendingDate/><date/>(在<ns4:documentDetails>内部)为空,但是我在方法中将它们定为价。 从我的请求中删除此标签后,即可正常调用服务,而不会出现“编组错误”。

这怎么可能?

完全感谢您的关注。

1 个答案:

答案 0 :(得分:0)

我已经找到问题的根源。

再次调试,我注意到我的XMLGregorianCalendar将小时,分钟,秒和时区设置为-2147483648,因为我项目中包含的Utils库以这种方式设置XMLGregorianCalendar:

GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(date);

    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(
            cal.get(Calendar.YEAR),
            cal.get(Calendar.MONTH)+1,
            cal.get(Calendar.DAY_OF_MONTH),
            DatatypeConstants.FIELD_UNDEFINED);

所以我首先在

中更改了此方法
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);

第二个我“发笑”制作了这个XD。

我的问题解决了