2012-01-16 11 views
5

Có cách nào để JAXB không lưu các trường có giá trị là giá trị mặc định được chỉ định trong chú thích @Element hay không, và sau đó đặt giá trị cho nó khi tải các phần tử từ XML là rỗng hoặc trống? Một ví dụ:JAXB Tránh lưu các giá trị mặc định

class Example 
{ 
    @XmlElement(defaultValue="default1") 
    String prop1; 
} 

Example example = new Example(); 
example.setProp1("default1"); 
jaxbMarshaller.marshal(example, aFile); 

nên generate:

<example/> 

Và khi tải

Example example = (Example) jaxbUnMarshaller.unmarshal(aFile); 
assertTrue(example.getProp1().equals("default1")); 

tôi đang cố gắng để làm điều này để tạo ra một tập tin cấu hình XML sạch, và làm cho nó tốt hơn có thể đọc được và kích thước nhỏ hơn.

Regars và cảm ơn trước.

+0

Tôi không tin rằng JAXB sẽ kiểm tra xem giá trị có bằng với giá trị mặc định hay không và do đó nên bỏ qua. Việc thứ 2 bị cắt nên hoạt động. Xác nhận không thành công? –

Trả lời

3

Bạn có thể làm một cái gì đó như sau bằng cách tận dụng XmlAccessorType(XmlAccessType.FIELD) và đưa logic trong các phương thức get/set:

Ví dụ

package forum8885011; 

import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
class Example { 

    private static final String PROP1_DEFAULT = "default1"; 
    private static final String PROP2_DEFAULT = "123"; 

    @XmlElement(defaultValue=PROP1_DEFAULT) 
    String prop1; 

    @XmlElement(defaultValue=PROP2_DEFAULT) 
    Integer prop2; 

    public String getProp1() { 
     if(null == prop1) { 
      return PROP1_DEFAULT; 
     } 
     return prop1; 
    } 

    public void setProp1(String value) { 
     if(PROP1_DEFAULT.equals(value)) { 
      prop1 = null; 
     } else { 
      prop1 = value; 
     } 
    } 

    public int getProp2() { 
     if(null == prop2) { 
      return Integer.valueOf(PROP2_DEFAULT); 
     } 
     return prop2; 
    } 

    public void setProp2(int value) { 
     if(PROP2_DEFAULT.equals(String.valueOf(value))) { 
      prop2 = null; 
     } else { 
      prop2 = value; 
     } 
    } 

} 

Demo

package forum8885011; 

import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Example.class); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     Example example = new Example(); 
     example.setProp1("default1"); 
     example.setProp2(123); 
     System.out.println(example.getProp1()); 
     System.out.println(example.getProp2()); 
     marshaller.marshal(example, System.out); 

     example.setProp1("FOO"); 
     example.setProp2(456); 
     System.out.println(example.getProp1()); 
     System.out.println(example.getProp2()); 
     marshaller.marshal(example, System.out); 
    } 

} 

Output

default1 
123 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<example/> 
FOO 
456 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<example> 
    <prop1>FOO</prop1> 
    <prop2>456</prop2> 
</example> 

Để biết thêm thông tin

+0

Vâng, chính xác là tôi muốn tránh "tất cả" mã đó và làm cho JAXB tự động thực hiện việc tải và lưu tài liệu. Dù sao, hoy tôi có thể xử lý các loại nguyên thủy (tức là tránh tiết kiệm của int, như tôi không thể làm cho họ null)? Khai báo chúng là Integer? – okelet

+0

@okelet - Tôi đã cập nhật mã của mình bằng thuộc tính 'int'. –

0

Đối với một giải pháp chương trình, cũng có tốt cũ Apache commons XmlSchema và bạn có thể kiểm tra đối với các giá trị mặc định với XmlSchemaElement.getDefaultValue()

Vì vậy, với một cái gì đó như

XmlSchemaElement elem = schema.getElementByName(ELEMENT_QNAME); 
String defval = elem.getDefaultValue(); 

bạn sẽ có thể thực hiện những gì bạn cần. Đã không thử nó ra cuối cùng, bởi vì tôi cần một giải pháp trực tiếp hơn, nhưng tôi hy vọng rằng sẽ giúp.