2016-04-15 3 views
0

Nous migrons notre application de Jboss 6 vers Wildfly 10, la plupart des services Web fonctionnent correctement, mais nous rencontrons un problème avec les balises de date vides dans la réponse d'un site Web externe Service:Wildfly 10 UnmarshalException dans les balises de date vides dans la réponse

java.security.PrivilegedActionException: javax.xml.bind.UnmarshalException 
- with linked exception: 
[com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 784; ] 


Caused by: java.lang.IllegalArgumentException: 
at org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parseBigInteger(Unknown Source) 
at org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(Unknown Source) 
at org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl.<init>(Unknown Source) 
at org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl.newXMLGregorianCalendar(Unknown Source) 
at __redirected.__DatatypeFactory.newXMLGregorianCalendar(__DatatypeFactory.java:180) 
at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$12.parse(RuntimeBuiltinLeafInfoImpl.java:592) 
... 158 more 

la ligne et la colonne sont le début de l'élément suivant

...<ADATE><date />... 

Comme vous pouvez le voir ce jour est vide et provoque l'analyseur à l'échec (je suppose que sur la base des preuves)

Ce

est un fragment de la définition WSDL pour cet élément XML:

<xsd:element name="ADATE"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="date" minOccurs="1" maxOccurs="100" type="xsd:date"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

Nous avons généré nos classes client avec Apache CXF 3.1.6 comme: wsdl2java -frontend jaxws21 ....

  • Lors de l'utilisation de l'implémentation de SEIStub, l'appel fonctionne pour le service Web.
  • Lorsque vous utilisez le même code à l'intérieur de Wildfly, cela ne fonctionne pas en lançant l'exception décrite.
  • Est-ce que toutes ces informations sont nécessaires?

Existe-t-il une autre implémentation JAXB configurable dans Wildfly 10?

Merci

Répondre

0

Nous avons créé une extension du XMLAdapter et nous avons déclaré la classe dans le package-info.java (à partir du dossier de réponse -> « sysrpc », un vieux CxF) comme suit:

package XXX; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 
import javax.xml.datatype.DatatypeFactory; 
import javax.xml.datatype.XMLGregorianCalendar; 

import java.util.Date; 


public class XMLGregorianCalendarXmlAdapter extends XmlAdapter<String, XMLGregorianCalendar>{ 

@Override 
public XMLGregorianCalendar unmarshal(String v) throws Exception { 
    if(v==null || v.trim().isEmpty()) { 
     return null; 
    } 
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(v); 
} 

@Override 
public String marshal(XMLGregorianCalendar v) throws Exception { 
    return v==null ? null : /*do something with the XMLGregorianCalendar */; 
} 

} 

Puis, en la package-info.java des classes générées de commande wsdl2java

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters 
({ 
    @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=XXX.XMLGregorianCalendarXmlAdapter.class,type=javax.xml.datatype.XMLGregorianCalendar.class), 
    @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=XXX.XMLGregorianCalendarXmlAdapter.class,type=javax.xml.datatype.XMLGregorianCalendar.class) 
}) 
@javax.xml.bind.annotation.XmlSchema(namespace = "urn:external-web-service:SYSRPC") 
package YYYY.sysrpc; 

Pour déboguer la communication avec un service Web externe:

dans le standalone.xml (situé dans $ WIL DFLY_HOME/autonome/configuration)

ajouter

<property name="org.apache.cxf.logging.enabled" value="true"/> 

A la fin des propriétés du système de tag

2

Vous avez une erreur en XML: date de balise est vide, mais le schéma dit qu'il doit avoir une certaine valeur. Essayez d'écrire la date correcte dedans.

Si vous voulez qu'il soit vide, vous pouvez écrire

xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

en XML et

nillable="true" 

en XSD.

+0

Malheureusement, cela ne fonctionne pas dans notre WSDL, mais d'autres personnes ont proposé la même solution, doit travailler "quelque part". –