0

次の WSDL から Apache CXF 2.x を使用して、Eclipse で Web サービス クライアントを作成しました。

https://test.timbrado.com.mx/cfdi/wstimbrado.asmx?WSDL

Web サービス呼び出しを実行すると、次のエラー スタック トレースが表示されます (サーバーは要求を処理できません ---> オブジェクト インスタンスとして確立されていないオブジェクトへの参照)。

javax.xml.ws.soap.SOAPFaultException: El servidor no puede procesar la solicitud. ---> Referencia a objeto no establecida como instancia de un objeto.
 [java]     at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(Unknown Source)
 [java]     at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(Unknown Source)
 [java]     at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
 [java]     at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
 [java]     at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(Unknown Source)
 [java]     at $Proxy34.generaTimbre(Unknown Source)
 [java]     at com.vital.fevital.funciones.FacturaElectronica.timbrarWebService(FacturaElectronica.java:1258)
 [java]     at facturaVital.factura.servlet.FacturaVenta.generaFactura(FacturaVenta.java:1128)
 [java]     at facturaVital.factura.servlet.FacturaVenta.doPost(FacturaVenta.java:127)
 [java]     at facturaVital.factura.servlet.FacturaVenta.doGet(FacturaVenta.java:86)
 [java]     at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
 [java]     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
 [java]     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
 [java]     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
 [java]     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
 [java]     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
 [java]     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
 [java]     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
 [java]     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
 [java]     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
 [java]     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
 [java]     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
 [java]     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
 [java]     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
 [java]     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 [java]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 [java]     at java.lang.Thread.run(Unknown Source) 

私がこのようにやっている呼び出し:

ObjectFactory of = new ObjectFactory();
    AuthenticationHeader ah = of.createAuthenticationHeader();
    ah.setUserName(cfdi.getUsuarioPAC());
    ah.setPassword(cfdi.getPasswordPAC());
    JAXBElement<AuthenticationHeader> jah = of.createAuthenticationHeader(ah);

    ServicioTimbradoPruebas stp = new ServicioTimbradoPruebas();
    ServicioTimbradoPruebasSoap stpSoap = stp.getServicioTimbradoPruebasSoap();

    try{
        WSBindingProvider bp = (WSBindingProvider)stpSoap;
        Header hdr = Headers.create((JAXBRIContext) JAXBContext.newInstance(AuthenticationHeader.class),jah);
        bp.setOutboundHeaders(hdr);
    }catch(Exception ex){
        ex.printStackTrace();
        error = "Error en webservice ";
    }
    byte [] xmlBytes = cfdi.getXml().getBytes("UTF-8");
    String result = stpSoap.generaTimbre(xmlBytes);

次の行でエラーが発生します。

String result = stpSoap.generaTimbre(xmlBytes);

以前は Web サービス呼び出しを実行できましたが、現在は実行できず、次のエラーが発生します。この問題を解決する方法について何か提案はありますか?

4

1 に答える 1

3

これはあまり答えではないと思いますが、とにかく:

あのサービスはマジでヤバい。

例えば

<cfdi:xmlBytes>cdi:246460475753</cfdi:xmlBytes>

<cfdi:GeneraTimbre>

WSDL コントラクトによると、オプションです。

     <s:element name="GeneraTimbre">
        <s:complexType>
           <s:sequence>
              <s:element minOccurs="0" maxOccurs="1" name="xmlBytes" type="s:base64Binary"/>
           </s:sequence>
        </s:complexType>
     </s:element>

( minOccurs="0"に注意してください!) しかし、オプションの部分なしでメッセージを送信すると、soapfault が発生します。

 <soap:Body>
      <soap:Fault>
         <faultcode>soap:MustUnderstand</faultcode>
         <faultstring>No se entendió el encabezado SOAP Security.</faultstring>
      </soap:Fault>
   </soap:Body>

最初に言ったように、これは大した答えにはなりませんが、おそらくアドバイスにすぎません。(私の推測では、彼らは ws-sec を実装しようとしましたが、ws-policy フレームワークなしで実行できますが、適切に使用する方法についてサービスの消費者にほとんど、またはまったく役に立たないでしょう)

于 2012-07-02T21:54:02.993 に答える