2016-03-22 15 views
9

Tôi đang xây dựng một loạt các lớp được liên kết có các cá thể mà tôi muốn có thể sắp xếp thành XML để tôi có thể lưu chúng vào một tệp và đọc lại chúng sau.Marshalling LocalDate bằng cách sử dụng JAXB

Hiện nay tôi đang sử dụng đoạn mã sau như một trường hợp thử nghiệm:

import javax.xml.bind.annotation.*; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 

import java.time.LocalDate; 

public class LocalDateExample 
{ 
    @XmlRootElement 
    private static class WrapperTest { 
    public LocalDate startDate; 
    } 

    public static void main(String[] args) throws JAXBException 
    { 
    WrapperTest wt = new WrapperTest(); 
    LocalDate ld = LocalDate.of(2016, 3, 1); 
    wt.startDate = ld; 
    marshall(wt); 
    } 

    public static void marshall(Object jaxbObject) throws JAXBException 
    { 
    JAXBContext context = JAXBContext.newInstance(jaxbObject.getClass()); 
    Marshaller marshaller = context.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
    marshaller.marshal(jaxbObject, System.out); 
    } 
} 

Kết quả XML là:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<wrapperTest> 
    <startDate/> 
</wrapperTest> 

Có một lý do tại sao các yếu tố startDate là trống rỗng? Tôi muốn nó chứa biểu diễn chuỗi của ngày (ví dụ: toString()). Tôi có cần viết một số mã của riêng tôi để làm điều này không?

Kết quả của java -version là:

openjdk version "1.8.0_66-internal" 
OpenJDK Runtime Environment (build 1.8.0_66-internal-b17) 
OpenJDK 64-Bit Server VM (build 25.66-b17, mixed mode) 

Trả lời

13

Bạn sẽ phải tạo ra một XmlAdapter như thế này:

public class LocalDateAdapter extends XmlAdapter<String, LocalDate> { 
    public LocalDate unmarshal(String v) throws Exception { 
     return LocalDate.parse(v); 
    } 

    public String marshal(LocalDate v) throws Exception { 
     return v.toString(); 
    } 
} 

Và chú thích lĩnh vực của bạn sử dụng

@XmlJavaTypeAdapter(value = LocalDateAdapter.class) 

Xem thêm javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters nếu bạn muốn xác định các bộ điều hợp của bạn ở mức gói.

+0

vẻ để thực hiện chính xác những gì tôi muốn - cảm ơn! – pwaring

2

http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html mô tả thiết lập lỗ.

Thời gian Joda cung cấp thay thế cho các lớp Ngày và Lịch hiện được cung cấp trong Java SE. Vì chúng được cung cấp trong một thư viện riêng JAXB không cung cấp một ánh xạ mặc định cho các lớp này.

Để đăng ký bộ điều hợp cho tất cả các tệp trong gói. bạn có thể thêm package-info.java vào gói bạn muốn đăng ký nó.

@XmlJavaTypeAdapters({ 
    @XmlJavaTypeAdapter(type=LocalDate.class, 
     value=LocalDateAdapter.class), 
}) 
package PACKAGE_NAME; 

import java.time.LocalDate; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters; 

Các adapter trông giống như:

import javax.xml.bind.annotation.adapters.XmlAdapter; 
import java.time.LocalDate; 

public class LocalDateAdapter extends XmlAdapter<String, LocalDate>{ 

    public LocalDate unmarshal(String v) throws Exception { 
     return LocalDate.parse(v); 
    } 

    public String marshal(LocalDate v) throws Exception { 
     return v.toString(); 
    } 

} 
+0

Tôi không sử dụng Joda Time, tôi đang sử dụng các lớp 'java.time. *' (Có vẻ tương tự nhưng là một phần của Java 8 và do đó không cần phải được chỉ định làm phụ thuộc). – pwaring

+0

Bạn nói đúng. Tôi chỉ sử dụng một giải pháp cũ của tôi để kiểm tra bạn. Tôi sẽ cập nhật câu trả lời của tôi –

+0

Cảm ơn, câu trả lời khác là một chút ngắn gọn hơn vì vậy tôi đã đánh dấu rằng như được chấp nhận. – pwaring

Các vấn đề liên quan