[Java] जैक्सब अनमरशल टाइमस्टैम्प


Answers

जेएसीएबी Date वस्तुओं को सीधे नहीं मार्शल कर सकता है, क्योंकि उनके पास स्पष्ट जानकारी के लिए स्पष्ट नहीं है। JAXB ने इस प्रयोजन के लिए XmlGregorianCalendar वर्ग प्रस्तुत किया, लेकिन सीधे उपयोग करने के लिए यह बहुत अप्रिय है।

मैं सुझाव देता हूं कि आपका timestamp फ़ील्ड XmlGregorianCalendar , और इस फ़ील्ड को अपडेट करने के लिए अपने विभिन्न तरीकों में बदलाव करें, जबकि आपके पास पहले से मौजूद सार्वजनिक इंटरफ़ेस, जहां संभव हो।

यदि आप Date फ़ील्ड को रखना चाहते हैं, तो आपको अपने खुद के XmlAdapter वर्ग को कार्यान्वित करने की ज़रूरत होगी, जिससे कि आपको अपनी Date को और एक्सएमएल से बदलना चाहिए।

Question

मैं जेएसीएबी को एक रीस्टेसिसी जेएक्स-आरएस सर्वर एप्लीकेशन में टाइमस्टैम्प को अपनाने के लिए नहीं मिल सकता।

मेरा वर्ग इस तरह दिखता है:

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "foo")
public final class Foo {
    // Other fields omitted

    @XmlElement(name = "timestamp", required = true)
    protected Date timestamp;

    public Foo() {}

    public Date getTimestamp() {
        return timestamp;
    }

    public String getTimestampAsString() {
        return (timestamp != null) ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timestamp) : null;
    }

    public void setTimestamp(final Date timestamp) {
        this.timestamp = timestamp;
    }

    public void setTimestamp(final String timestampAsString) {
        try {
            this.timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(timestampAsString);
        } catch (ParseException ex) {
            this.timestamp = null;
        }
    }
}

कोई विचार?

धन्यवाद।




इस एडाप्टर का उपयोग करना सुरक्षित होना चाहिए:

public class DateXmlAdapter extends XmlAdapter<String, Date> {

    /**
     * Thread safe {@link DateFormat}.
     */
    private static final ThreadLocal<DateFormat> DATE_FORMAT_TL = new ThreadLocal<DateFormat>() {

        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        }

    };

    @Override
    public Date unmarshal(String v) throws Exception {
        return DATE_FORMAT_TL.get().parse(v);
    }

    @Override
    public String marshal(Date v) throws Exception {
        return DATE_FORMAT_TL.get().format(v);
    }

}