JAXB解组空标签

时间:2014-06-09 13:02:40

标签: binding jaxb unmarshalling xjc

我试图解密由第三方生成的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);
  }

}

提前感谢大家的关注。

0 个答案:

没有答案