2013-05-15 6 views
10

ho creato un servizio Web utilizzando:ADBException: sottoelemento imprevisto

  • Apache Axis 2 CodeGen guidata v.1.6.2 (Binding: ADB)
  • Eclipse Juno
  • Tomcat 7
  • Java 6

il servizio restituisce un oggetto Java personalizzato (bean di dati) al client, ma sono incappato in un'eccezione nel codice client:

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message 

Da quello che ho cercato, ancora n di nuovo ... Penso che questo sia un problema molto comune ma non hanno ancora avuto una risposta definitiva su cosa dovrebbe essere fatto per correggerlo.

Alcuni post su questo e altri forum indicano che il WSDL deve essere modificato (un po 'di spazio dei nomi), o lo stub del client necessita di modifica. Alcuni affermano addirittura che c'è un bug nell'ADB. È stato sicuramente un bug nelle versioni precedenti di Axis, ma ci sono molti post negli archivi di posta che affermano che il bug è stato corretto. Questi mailing-archives erano correlati alle precedenti versioni di Axis2.

Ora le mie domande sono:

  1. È ancora un bug?
  2. Che cosa esattamente deve essere modificato nel WSDL o nello stub del client?

Ciò che è degno di nota è che ho creato un servizio Web simile che restituisce una "stringa" al client. Funziona bene! Quindi, fallisce quando è coinvolto un tipo di dati complesso.

C'era alcune informazioni sul Apache's website, sotto il titolo "Limitazioni note" ...

Si legge: "ADB è destinata ad essere un quadro databinding 'semplice' e non aveva lo scopo di compilare tutte tipi di schemi. le seguenti limitazioni sono più evidenziati.

  1. estensioni tipo complesso e limiti ".

È questo il problema?

Il seguente è il frammento di codice dal file WSDL che potrebbe essere di qualche interesse per voi ...

<wsdl:types> 
     <xs:schema xmlns:ax26="http://mywebservice/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="schemaTargetNs"> 
      <xs:import namespace="http://mywebservice/xsd"/> 
      <xs:element name="getMsg"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="reqData" nillable="true" type="ax25:DataBean"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="getMsgResponse"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="return" nillable="true" type="ax25:DataBean"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 
     <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mywebservice/xsd"> 
      <xs:complexType name="DataBean"> 
       <xs:sequence> 
        <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/> 
        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:schema> 
    </wsdl:types> 

Ora come posso risolvere il problema? Dovrei includere qualche altro frammento di codice qui?

risposta

1

Il codice generato da CodeGen (da WSDL) per l'oggetto Java (bean) che stavo utilizzando prevedeva uno spazio dei nomi diverso per i campi nel bean. In qualche modo uno spazio dei nomi errato era presente nel codice generato da Axis. Ho corretto lo spazio dei nomi per riflettere cosa avrebbe dovuto essere e tutto ha funzionato bene. Riesco a vedere persone che rispondono ancora a questa domanda, quindi ho pensato di riproporre la mia soluzione qui (l'ho già postata in risposta alla soluzione di Kenster). Poiché nessuna delle soluzioni pubblicate prima di me ha trovato la soluzione funzionante, non ho accettato alcuna risposta.

10

"Sottoelemento non previsto" significa che il messaggio ricevuto dal destinatario conteneva un elemento XML che il ricevitore non si aspettava. "{schemaTargetNs} message" è il nome dell'elemento imprevisto che ha incontrato. In altre parole, il mittente ha inviato un messaggio non valido al destinatario.

  • Il mittente potrebbe aver incluso un elemento che non avrebbe dovuto.
  • Il mittente potrebbe aver omesso un elemento obbligatorio.
  • Il mittente potrebbe aver inserito gli elementi nell'ordine errato.
  • Il mittente potrebbe aver inviato un messaggio completamente errato.

Se il server ha emesso l'eccezione segnalata, il client ha inviato un messaggio non valido al server. Se il client ha emesso l'eccezione, l'errore era nella risposta dal server al client.

+0

L'errore è sicuramente nella risposta dal server, ma come scoprire quale elemento era previsto? A meno che non lo sappia, non sarò in grado di sistemare le cose. Ho la risposta XML dal server e mi sembra soddisfacente. –

+0

Bene, se dovessi eseguire il client in un debugger e/o se avessi lo stacktrace per org.apache.axis2.AxisFault, potresti trovare la riga di codice specifica nel parser del messaggio che sta generando l'errore . A quel punto dovrebbe essere ovvio quale elemento si aspettava. – Kenster

+0

Probabilmente si tratta del fatto che il client è stato generato in base a una copia non corretta del WSDL. Quindi la risposta inviata dal server non corrisponde a ciò che il cliente si aspetta. – Kenster

5

se xsd (wsdl) è corretto con la richiesta xml o la risposta è perché il problema è l'ordine degli elementi xml. Una soluzione possibile è generare il tuo client asse2 con l'opzione -Eosv. questo lavoro per me.

+0

Ha funzionato anche per me! –

0

Quando ho controllato il codice asse, ho scoperto questa

if(new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName())) 

è qui errore accade, . equals() metodo di QName controlla localPart & namespaceURI . ma reader.getName() non ha spazio dei nomi URI set e quindi l'errore inviteranno

ho cambiato tutti i se-assegno da

if(new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName())) 

a

if(new javax.xml.namespace.QName("someElementName").equals(reader.getName())) 

e ha funzionato bene per me

0

Questo errore può essere in qualche modo fuorviante. Dopo aver modificato il WSDL e aggiunto un nuovo elemento obbligatorio, ho creato il mio client. Di questo errore è apparso. La soluzione era che ho dimenticato di riempire questo elemento in un metodo del mio servizio web. Se viene visualizzato questo errore, controlla anche se gli elementi obbligatori sono compilati all'interno del server.

1

Cerca nel tuo file .xsd. Ordina gli elementi xs in ordine alfabetico sotto il tuo <xs:extension base=...>. Ciò si adatta alle tue esigenze.

0

nel mio caso il servizio Web invia elementi in ordine diverso rispetto alla sequenza che si trova su xsd. Sto modificando lo stub in questo momento, quindi l'ordine non ha importanza, perché non ho alcuna possibilità di alterare il servizio web.