jaxb编组具有自定义日期格式的LocalDate

时间:2019-07-05 14:04:05

标签: java jaxb localdate

我在这里关注了一个话题,但没有回答我的问题。 我希望Soap响应将本地日期格式设置为Soap请求中的相同本地日期。

例如:我的本地日期请求:1990年10月10日 响应必须是1990年10月10日,但我总是得到1990-10-10,因为toString会以这种方式格式化...

我的代码:

public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {

public DateTimeFormatter dateFormat() {
    //DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[MM/dd/yyyy][MM-dd-yyyy][yyyy/MM/dd][yyyy-MM-dd]");    

    DateTimeFormatter mmddyyyySlash = DateTimeFormatter.ofPattern("MM/dd/yyyy");
    DateTimeFormatter mmddyyyy = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
    DateTimeFormatter yyyymmdd = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    DateTimeFormatter yyyymmddSlash = DateTimeFormatter.ofPattern("yyyy/MM/dd");    

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendOptional(mmddyyyySlash)
            .appendOptional(mmddyyyy)
            .appendOptional(yyyymmdd)
            .appendOptional(yyyymmddSlash)
            .toFormatter();

    return formatter;
}

public LocalDate unmarshal(String v) throws Exception {
    DateTimeFormatter formatter = dateFormat();
    return LocalDate.parse(v, formatter);
}

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

我该如何解决? 我试图:

public String marshal(LocalDate v) throws Exception {
    DateTimeFormatter formatter = dateFormat();
    String ld = v.format(formatter);

    return ld;
}

但是结果: 05/05 / 199005-05-19901990-05-051990 / 05/05 :(

1 个答案:

答案 0 :(得分:1)

尝试使用您的dateFormat()方法。您可以运行它以查看其工作方式。我做了一点简化。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

public class LocalDateAdapter {

    public DateTimeFormatter dateFormat() {
        DateTimeFormatter mmddyyyySlash = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                             .appendOptional(mmddyyyySlash).toFormatter();
        return formatter;
    }

    public LocalDate unmarshal(String v) throws Exception {
        DateTimeFormatter formatter = dateFormat();
        return LocalDate.parse(v, formatter);
    }

    public String marshal(LocalDate v) {
        return v.format(dateFormat());
    }

    public static void main(String[] args) {
        LocalDate date = LocalDate.now();

        LocalDateAdapter adapter = new LocalDateAdapter();
        String dateAsString = adapter.marshal(date);
        System.out.println("Date as String: " + dateAsString);

        LocalDate dateAsDate = adapter.unmarshal(dateAsString);
        System.out.println("Date back as LocalDate: " + adapter.marshal(dateAsDate));

    }
}

修改

已更新,以显示如何使用marshall()unmarshall()来指示正确保存日期信息。

现在打印出来:

Date as String: 07/05/2019
Date back as LocalDate: 07/05/2019

更新

这是一个示例,说明如何使用@XmlJavaTypeAdapter来区分何时将一种适配器类型与另一种适配器类型用于不同的日期格式。

在不了解更广泛的系统上下文的情况下,这是您可以强制使用哪种格式程序的一种方法。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

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

class DateWithSlashAdapter extends XmlAdapter<String, LocalDate> {

    public DateTimeFormatter dateFormat() {
        return DateTimeFormatter.ofPattern("MM/dd/yyyy");
    }

    @Override
    public LocalDate unmarshal(String v) {
        DateTimeFormatter formatter = dateFormat();
        return LocalDate.parse(v, formatter);
    }

    @Override
    public String marshal(LocalDate v) {
        return v.format(dateFormat());
    }
}

class DateWithHyphenAdapter extends XmlAdapter<String, LocalDate> {

    public DateTimeFormatter dateFormat() {
        return DateTimeFormatter.ofPattern("MM-dd-yyyy");
    }

    @Override
    public LocalDate unmarshal(String v) {
        DateTimeFormatter formatter = dateFormat();
        return LocalDate.parse(v, formatter);
    }

    @Override
    public String marshal(LocalDate v) {
        return v.format(dateFormat());
    }
}

/** Example of a class representing your SOAP payload */
class SoapRequestExample {
    @XmlJavaTypeAdapter(DateWithSlashAdapter.class)
    LocalDate someDateWithSlashes;

    @XmlJavaTypeAdapter(DateWithHyphenAdapter.class)
    LocalDate someDateWithHyphens;
}