2016-04-15 3 views
0

Мы переносим наше приложение с Jboss 6 на Wildfly 10, большинство веб-сервисов работает нормально, но перед нами стоит проблема с пустыми тегами даты в ответе от внешней сети обслуживание:Wildfly 10 UnmarshalException в пустых тегах даты в ответе

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 

строка и столбец являются началом следующего элемента

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

Как вы можете видеть дату пуст и приводит к тому, анализатору неудачу (я предполагаю, что на основании доказательств)

Это фрагмент из определения WSDL для этого 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> 

Мы сформировали наши клиентские классы с Apache CXF 3.1.6 как: wsdl2java -frontend jaxws21 ....

  • При использовании реализации SEIStub вызов работает для веб-службы.
  • При использовании одного и того же кода внутри Wildfly он не работает, бросая описанное исключение.
  • Нужна ли эта информация?

Есть ли способ другой реализации JAXB, который можно настроить в Wildfly 10 ?, как?

Благодаря

ответ

0

Мы создали расширение XMLAdapter и мы объявили класс в package-info.java (из папки ответа -> «sysrpc», старый CxF) следующим образом:

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 */; 
} 

} 

Тогда в package-info.java сгенерированных классов из команды 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; 

Для отладки связи с внешним веб-службы:

в standalone.xml (находится в $ WIL DFLY_HOME/автономный/конфигурации)

добавить

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

В конце системообразующих свойств тега

2

У вас ошибка в XML: дата тег пуст, но схема говорит, что это должно иметь какое-то значение. Попробуйте написать правильную дату.

Если вы хотите, чтобы быть пустым вы можете написать

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

в XML и

nillable="true" 

в XSD.

+0

К сожалению, это не работает в нашем WSDL, но некоторые другие люди предложили такое же решение, должно работать "где-то". –