我试图解密由第三方生成的xml,我没有向我发送任何文档或合同。这很糟糕,所以我无法预测第三方xml会发生什么。我的业务逻辑是我必须向第三方发送(编组)一个xml,并接收相同的数据。我目前的问题在于我收到这些数据。数据与空标签一起提交,因此在研究之后我为这些标签设计了一个解决方案(在xsd中)。如上所述(使用jaxb 2.0标准impl。):
<xs:simpleType name="emptyIntegerAllowed">
<xs:union memberTypes="xs:integer empty" />
</xs:simpleType>
<xs:simpleType name="emptyLongAllowed">
<xs:union memberTypes="xs:long empty" />
</xs:simpleType>
<xs:simpleType name="emptyDecimalAllowed">
<xs:union memberTypes="xs:double empty" />
</xs:simpleType>
<xs:simpleType name="empty">
<xs:restriction base="xs:string">
<xs:enumeration value="" />
</xs:restriction>
</xs:simpleType>
并且示例使用了那样的类型:
<xs:element name="peso" type="emptyDecimalAllowed" minOccurs="0"/>
这种方法确实适用于整数和长类型,但现在我遇到了小数类型的问题(当它们不是空的时候)。 Unmarshalling'0,00'值产生以下堆栈:
javax.xml.bind.UnmarshalException - 链接异常: [org.xml.sax.SAXParseException; systemId:file:/home/joao/jboss-4.2.2.GA/serv/rio_branco/correio/postagem/retorno/testejoao.xml; lineNumber:2; columnNumber:1566; cvc-datatype-valid.1.2.3:'0,00'不是union类型'emptyDecimalAllowed'的有效值。]
在运行时(甚至调试)我无法实现问题的原因,在我的java代码中,它甚至按照上面设计的xjb(jaxb扩展 - xjc)命中了我创建的javaTypeAdapter:
<jaxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc"
jaxb:version="2.0">
<jaxb:globalBindings localScoping="toplevel"/>
<jaxb:bindings schemaLocation="PostagemCorreio.xsd" node="/xs:schema">
<jaxb:bindings node="//xs:simpleType[@name='emptyDecimalAllowed']">
<xjc:javaType name="net.riobranco.vendas.services.correio.EmptyDecimalAllowed"
adapter="net.riobranco.vendas.services.correio.DecimalAdapter" />
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
我的适配器设计如上:
public class DecimalAdapter extends XmlAdapter<String, EmptyDecimalAllowed> {
public EmptyDecimalAllowed unmarshal(String value) {
value = value.replace(',', '.');
return new EmptyDecimalAllowed(value);
}
public String marshal(EmptyDecimalAllowed value) {
if (value == null) {
return null;
}
return value.toString();
}
}
我的binging java课程:
public class EmptyDecimalAllowed extends BigDecimal {
public EmptyDecimalAllowed(String value) {
super(value);
}
}
提前感谢大家的关注。