解组空的xml元素jaxb

时间:2018-12-07 09:57:52

标签: java jaxb marshalling unmarshalling

我有一个像org.apache.commons.jelly.JellyTagException: jar:file:/var /jenkins_home/plugins/build-pipeline-plugin/WEB-INF/lib/build-pipeline-plugin.jar!/au/com/centrumsystems/hudson/plugin/buildpipeline/BuildPipelineView/bpp.jelly:23:31: <st:include> No page found 'buildCardTemplate.jelly' for class au.com.centrumsystems.hudson.plugin.buildpipeline.BuildPipelineView 这样的空标签。当我解组它时,如果此属性是long或float类型,则为null。但是,如果此属性是字符串的类型,则该属性为<tagName/>。编组后是tagName = '';。拆封时如何将字符串java属性的空标记名设置为null?

1 个答案:

答案 0 :(得分:0)

(至少)有两种方法可以执行此操作。

  1. 如果这些类是您自己的,并且不是从xsd或类似的类自动生成的,则可以使用适配器。

例如购物车类:

@XmlRootElement(name = "Cart")
@XmlAccessorType(XmlAccessType.FIELD)
public class Cart {

    @XmlJavaTypeAdapter(EmptyTagAdapter.class)
    protected String tagName;
}

可以使用如下所示的适配器:

public class EmptyTagAdapter extends XmlAdapter<String, String> {

    @Override
    public String marshal(String arg0) throws Exception {
        return arg0;
    }

    @Override
    public String unmarshal(String arg0) throws Exception {
       if(arg0.isEmpty()) {
           return null;
       }
        return arg0;
    }
}

对于如下所示的xml:

<Cart>
  <tagName/>
</Cart>

您将获得空的tagName作为null。

  1. 如果您的类是从xsd生成的,则可以提及该字段可以为nillable。

例如如下:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1">
    <xs:element name="Cart">
        <xs:complexType>
            <xs:all>
                <xs:element name="tagName" type="xs:string" nillable="true" />
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

,然后您需要在xml中包含空元素xsi:nil =“ true”,例如以下示例:

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

结果将相同,值为null。

我更喜欢使用适配器,但这取决于您的情况。希望其中一种情况能涵盖您。