首页 > 解决方案 > 即使在 JAXB 中从 XmlAdapter 返回 null 后,标记也不会从 XML 中删除

问题描述

  1. 我想从 XML 中删除空标签。

<Employee> <FirstName>Amit</FirstName> <LastName></LastName> </Employee>

因此,在上面的 XML 中,lastName 是空白的,目前用 XML 中的 Empty 标记表示。但我想要以下格式的 XML:

<Employee> <FirstName>Amit</FirstName> </Employee>

  1. 因此,扩展了 XmlAdapter,如下所示:

    package com.jaxb.domain;
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    import org.springframework.util.StringUtils;
    
    public class NullifyAdapter extends XmlAdapter<String, String> {
    
      @Override
      public String unmarshal(String strValue) throws Exception {
        // TODO Auto-generated method stub
        return strValue;
      }
    
      @Override
      public String marshal(String strValue) throws Exception {
        if (StringUtils.isEmpty(strValue)) {
          return null;
        }
        return strValue;
      }
    
    }
    
  2. 在 package-info.java 中将其注册为包级别,如下所示:

    @XmlJavaTypeAdapters({
    @XmlJavaTypeAdapter(value=NullifyAdapter.class, type=String.class)
    })
    package com.jaxb.domain;
    
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
    
  3. 上述更改后生成的 XML 如下所示:

<Employee> <FirstName>Amit</FirstName> </LastName> </Employee>

  1. 在我的 jaxb 绑定类中,该字段定义为:

    @XmlElement(name = "LastName")
    protected String lastName;
    

请建议,如何完全删除姓氏?我需要删除很多字段,因此需要类似行的解决方案。

标签: javajaxbjaxb2

解决方案


您可以使用 设置 XML 的LastName元素定义required=true
这将导致生成的lastName属性被注释@XmlAttribute(required=true)
这样,如果元素为空,JAXB 就不会序列化该元素。


推荐阅读