【问题标题】:xml annotation which can stop an attribute to being converted into an xml stringxml 注释,它可以阻止属性被转换为 xml 字符串
【发布时间】:2013-07-22 15:28:23
【问题描述】:

我在一个类中有一个属性'abc'。我想将此属性限制为转换为 XML 字符串格式。
我可以在属性上使用任何 XMl 注释,以避免将其转换为 XML 字符串吗?

请有人帮我解决这个问题。

【问题讨论】:

    标签: java xml annotations


    【解决方案1】:

    您可以使用@XmlTransient 注解。
    欲了解更多信息,请访问@XmlTransient Sample
    下面是在 JAXB 中避免 XML 转换中的“密码”属性的示例。所以它用
    注释 @XmlTransient 注解

        import java.util.List;
        import javax.xml.bind.annotation.*;
    
       @XmlRootElement
       @XmlType(propOrder = { "phoneNumbers", "name"})
       public class Customer extends Person {
    
       private String password;
       private List<String> phoneNumbers;
    
       @XmlTransient
       public String getPassword() {
            return password;
       }
    
       public void setPassword(String password) {
           this.password = password;
       }
    
      @XmlElement(name = "phone-number")
      public List<String> getPhoneNumbers() {
        return phoneNumbers;
      }
    
      public void setPhoneNumbers(List<String> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
      }
    
    
     }   
     /* demo class*/ 
      public class Demo {
    
        public static void main(String[] args) throws Exception {
             JAXBContext jc = JAXBContext.newInstance(Customer.class);
    
             Unmarshaller unmarshaller = jc.createUnmarshaller();
             File xml = new File("input.xml");
            Customer customer = (Customer) unmarshaller.unmarshal(xml);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(customer, System.out);
       }
    
      }  
    
    
      /*Generated xml doesn't have password tag */  
      /* <?xml version="1.0" encoding="UTF-8"?>  
         <customer>  
            <id>123</id>
            <phone-number>555-1111</phone-number>
            <phone-number>555-2222</phone-number>
            <name>Jane Doe</name>
         </customer>  
      */
    

    【讨论】:

      【解决方案2】:

      当您使用JAXB (JSR-222) 实现来处理您的 XML 时,您有几个选项可以排除属性。

      选项 #1 - @XmlTransient

      排除字段/属性的最常见方法是使用@XmlTransient 对其进行注释。

      import javax.xml.bind.annotation.*;
      
      @XmlRootElement
      @XmlAccessorType(XmlAccessType.FIELD)
      public class Root {
      
          @XmlTransient
          private String foo;
      
          private String bar;
      
          public void setFoo(String foo) {
              this.foo = foo;
          }
      
          public void setBar(String bar) {
              this.bar = bar;
          }
      
      }
      

      选项 #2 - @XmlAccessorType(XmlAccessType.NONE)

      如果你想排除一半以上的属性,我建议在你的类上设置@XmlAccessorType(XmlAccessType.NONE)。然后只会映射带注释的字段/属性。在下面的示例中,我们不必排除 foo,但必须特别包含 bar。

      import javax.xml.bind.annotation.*;
      
      @XmlRootElement
      @XmlAccessorType(XmlAccessType.NONE)
      public class Root {
      
          private String foo;
      
          @XmlElement
          private String bar;
      
          public void setFoo(String foo) {
              this.foo = foo;
          }
      
          public void setBar(String bar) {
              this.bar = bar;
          }
      
      }
      

      选项 #3 - 瞬态

      如果您正在使用字段访问,那么您也可以简单地将字段标记为瞬态以将其排除。

      import javax.xml.bind.annotation.*;
      
      @XmlRootElement
      @XmlAccessorType(XmlAccessType.FIELD)
      public class Root {
      
          private transient String foo;
      
          private String bar;
      
          public void setFoo(String foo) {
              this.foo = foo;
          }
      
          public void setBar(String bar) {
              this.bar = bar;
          }
      
      }
      

      演示

      无论您选择哪个选项,都可以使用以下演示代码。

      import javax.xml.bind.*;
      
      public class Demo {
      
          public static void main(String[] args) throws Exception {
              JAXBContext jc = JAXBContext.newInstance(Root.class);
      
              Root root = new Root();
              root.setFoo("FOO");
              root.setBar("BAR");
      
              Marshaller marshaller = jc.createMarshaller();
              marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
              marshaller.marshal(root, System.out);
          }
      
      }
      

      输出

      在输出中,我们看到foo 元素已从输出中排除。

      <?xml version="1.0" encoding="UTF-8"?>
      <root>
         <bar>BAR</bar>
      </root>
      

      更多信息

      【讨论】:

        【解决方案3】:

        你在找@XMLTransient吗?

        【讨论】:

        • 您能否详细说明一下,这将做什么以及如何使用它?
        • 它会告诉 JaxB 或您使用的任何实现在转换 Java 对象时跳过该属性。使用它:blog.bdoughan.com/2012/08/…@Prabhaker 建议
        【解决方案4】:

        @XmlTransient 阻止将属性转换为 xml

        【讨论】:

          猜你喜欢
          • 2020-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-15
          • 2018-08-29
          相关资源
          最近更新 更多