响应中空日期标签中的 Wildfly 10 UnmarshalException
Wildfly 10 UnmarshalException in empty date tags in the response
我们正在将我们的应用程序从 Jboss 6 迁移到 Wildfly 10,大多数网络服务 运行 正常,但我们面临来自外部网络的响应中日期标签为空的问题服务:
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.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 实现时,调用适用于网络服务。
- 在 Wildfly 中使用相同的代码时,它无法抛出所描述的异常。
- 需要这些信息吗?
是否有任何方法可以在 Wildfly 10 中配置另一个 JAXB 实现?如何?
谢谢
您在 XML 中出错:标记日期为空,但架构表示它必须有一些值。尝试在其中写入正确的日期。
如果你想让它为空你可以写
xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
在XML和
nillable="true"
在XSD.
我们创建了 XmlAdapter 的扩展,并在包中声明了 class-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命令生成的classes的包-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;
调试与外部网络服务的通信:
在standalone.xml(位于$WILDFLY_HOME/standalone/configuration)
添加
<property name="org.apache.cxf.logging.enabled" value="true"/>
在系统属性标签的末尾
我们正在将我们的应用程序从 Jboss 6 迁移到 Wildfly 10,大多数网络服务 运行 正常,但我们面临来自外部网络的响应中日期标签为空的问题服务:
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.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 实现时,调用适用于网络服务。
- 在 Wildfly 中使用相同的代码时,它无法抛出所描述的异常。
- 需要这些信息吗?
是否有任何方法可以在 Wildfly 10 中配置另一个 JAXB 实现?如何?
谢谢
您在 XML 中出错:标记日期为空,但架构表示它必须有一些值。尝试在其中写入正确的日期。
如果你想让它为空你可以写
xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
在XML和
nillable="true"
在XSD.
我们创建了 XmlAdapter 的扩展,并在包中声明了 class-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命令生成的classes的包-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;
调试与外部网络服务的通信:
在standalone.xml(位于$WILDFLY_HOME/standalone/configuration)
添加
<property name="org.apache.cxf.logging.enabled" value="true"/>
在系统属性标签的末尾