0

我们正在将我们的应用程序从 Jboss 6 迁移到 Wildfly 10,大多数 Web 服务运行正常,但是我们面临一个外部 Web 服务响应中的空日期标签的问题:

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 />...

如您所见,日期为空并导致解析器失败(我假设基于证据)

这是该 XML 元素的 WSDL 定义的片段:

   <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 实现时,该调用适用于 Web 服务。
  • 在 Wildfly 中使用相同的代码时,它不会抛出所描述的异常。
  • 需要这些信息吗?

有没有其他可以在 Wildfly 10 中配置的 JAXB 实现?,如何?

谢谢

4

2 回答 2

2

您在 XML 中有一个错误:标记日期为空,但模式表示它必须具有某些值。尝试在其中写下正确的日期。

如果你想让它为空,你可以写

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

在 XML 和

 nillable="true" 

在 XSD 中。

于 2016-04-19T13:29:15.627 回答
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 */;
}

}

然后在从 wsdl2java 命令生成的类的 package-info.java 中

@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;

调试与外部 Web 服务的通信:

在standalone.xml 中(位于$WILDFLY_HOME/standalone/configuration)

添加

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

在系统属性标签的末尾

于 2016-04-20T13:19:38.567 回答