जब आप JAXB marshals xsd: dateTime का उपयोग किया गया दिनांक प्रारूप निर्दिष्ट करते हैं?


86

जब JAXB XMLGregorianCalendarएक xsd में दिनांक ऑब्जेक्ट ( ) को डेटर्शेट करता है: डेटाइम तत्व। आप परिणामी XML के प्रारूप को कैसे निर्दिष्ट कर सकते हैं?

उदाहरण के लिए: डिफ़ॉल्ट डेटा प्रारूप मिलीसेकंड का उपयोग करता है <StartDate>2012-08-21T13:21:58.000Z</StartDate> मुझे मिलीसेकंड को छोड़ना होगा। <StartDate>2012-08-21T13:21:58Z</StartDate>

मैं आउटपुट फॉर्म / तिथि प्रारूप को कैसे निर्दिष्ट कर सकता हूं जो मैं इसका उपयोग करना चाहता हूं? मैं ऑब्जेक्ट javax.xml.datatype.DatatypeFactoryबनाने के लिए उपयोग कर रहा हूं XMLGregorianCalendar

XMLGregorianCalendar xmlCal = datatypeFactory.newXMLGregorianCalendar(cal);

जवाबों:


126

XmlAdapterXML टाइप करने के लिए दिनांक को कैसे अनुकूलित किया जाए इसका उपयोग आप कर सकते हैं ।

package com.example;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, Date> {

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

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

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

}

फिर आप @XmlJavaTypeAdapterएनोटेशन का उपयोग यह निर्दिष्ट करने के लिए करते हैं कि XmlAdapterइसका उपयोग किसी विशिष्ट फ़ील्ड / संपत्ति के लिए किया जाना चाहिए।

@XmlElement(name = "timestamp", required = true) 
@XmlJavaTypeAdapter(DateAdapter.class)
protected Date timestamp; 

Xjb बाइंडिंग फ़ाइल का उपयोग करना:

<xjc:javaType name="java.util.Date" xmlType="xs:dateTime"
        adapter="com.example.DateAdapter"/>

उपर्युक्त एनोटेशन का उत्पादन करेगा।
(अंत में xjcनाम स्थान जोड़कर xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc") :


2
इस उत्तर के लिए धन्यवाद! क्या xsd या बाइंडिंग फ़ाइल के माध्यम से एनोटेशन जोड़ना संभव है? मैंने केवल आपके बार-बार ब्लॉग प्रविष्टि bindings.xml के बारे में पाया, लेकिन यह अन्य पहलुओं को शामिल करता है, मुझे लगता है।
गुएरा

9
जैसा कि @PeterRader ने उल्लेख किया है, SimpleDateFormat थ्रेड-सुरक्षित नहीं है - यदि दो धागे एक साथ मार्शल या अनमरशाल में प्रवेश करने थे, तो आप बहुत अप्रत्याशित परिणाम प्राप्त कर सकते हैं। यह सामान्य परीक्षण में पुन: पेश करने के लिए बहुत मुश्किल होगा, लेकिन लोड के तहत हो सकता है, और निदान करने के लिए अत्यधिक कठिन होगा। मार्शाल और अनमरशाल (लेकिन यदि आवश्यक हो तो एक स्थिर प्रारूप स्ट्रिंग का उपयोग करें) के साथ एक नया SimpleDateFormat बनाना बेहतर है।
कोलसेलॉ

1
मैंने यह किया और यह लगभग काम कर गया। हालाँकि मुझे Class has two properties of the same name "timeSeries"त्रुटि हो रही थी - यह गेट लेटर पर एनोटेशन को लगाकर हल किया गया था न कि सदस्य स्तर पर। (से @megathor के लिए धन्यवाद stackoverflow.com/questions/6768544/... )
gordon613

1
@ gordon613 - यह लेख एनोटेशन डालने के लिए कुछ अतिरिक्त जानकारी प्रदान करेगा: blog.bdouagan.com/2011/06/using-jaxbs-xmlaccessortype-to.html
bdouagan

3
चूंकि महत्वपूर्ण ब्लॉक को "सिंक्रनाइज़" से संरक्षित किया गया है, इसलिए कोई समस्या नहीं है। यदि एकाधिक कॉल किए जाते हैं तो (प्रदर्शन) समस्या होगी।
माइक Argyriou

17

मैं XMLGregorianCalendar बनाने के लिए एक SimpleDateFormat का उपयोग करता हूं, जैसे कि इस उदाहरण में:

public static XMLGregorianCalendar getXmlDate(Date date) throws DatatypeConfigurationException {
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(date));
}

public static XMLGregorianCalendar getXmlDateTime(Date date) throws DatatypeConfigurationException {
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(date));
}

पहला तरीका XMLGregorianCalendar का एक उदाहरण बनाता है जो XML marshaller द्वारा एक मान्य xsd: तिथि के रूप में स्वरूपित किया जाता है, दूसरी विधि एक मान्य xsd: dateTime में परिणामित होती है।


2

मेरे लिए बहुत आसान तरीका है। जावा में marshalling के लिए XMLGregorianCalendar स्वरूपण।

मैं सिर्फ अच्छे प्रारूप में अपना डेटा बनाता हूं। toStringअच्छा परिणाम उत्पादन बुलाया जाएगा।

public static final XMLGregorianCalendar getDate(Date d) {
    try {
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(d));
    } catch (DatatypeConfigurationException e) {
        return null;
    }
}

1

https://www.baeldung.com/jaxb

public class DateAdapter extends XmlAdapter<String, Date> {

    private static final ThreadLocal<DateFormat> dateFormat 
      = new ThreadLocal<DateFormat>() {

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

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

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

0

उपयोग:

import com.company.LocalDateAdapter.yyyyMMdd;
...

@XmlElement(name = "PROC-DATE")
@XmlJavaTypeAdapter(yyyyMMdd.class)
private LocalDate processingDate;

LocalDateAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {

    public static final class yyyyMMdd extends LocalDateAdapter {
        public yyyyMMdd() {
            super("yyyyMMdd");
        }
    }

    public static final class yyyy_MM_dd extends LocalDateAdapter {
        public yyyy_MM_dd() {
            super("yyyy-MM-dd");
        }
    }

    private final DateTimeFormatter formatter;

    public LocalDateAdapter(String pattern) {
        formatter = DateTimeFormat.forPattern(pattern);
    }

    @Override
    public String marshal(LocalDate date) throws Exception {
        return formatter.print(date);
    }

    @Override
    public LocalDate unmarshal(String date) throws Exception {
        return formatter.parseLocalDate(date);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.