java - jaxb 使用自定义日期格式编码 LocalDate

标签 java jaxb localdate

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

例如:我的本地日期请求:10/10/1990 响应需要是 10/10/1990 但我总是得到 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 :(

最佳答案

尝试使用您的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;
}

关于java - jaxb 使用自定义日期格式编码 LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904578/

相关文章:

java - 如何获取 OffsetDateTime->LocalDateTime 并将其保存为 UTC?

java - 以明文形式查看 UDP 消息时出现问题

java - 解码错误 : unexpected element (uri: local:), 预期元素为

java - JAXB异常 : not a valid property on class

java - 如何获取给定季度的月份

java - 无法解析日期 2020 年 4 月 15 日 12 :14:17 AM to LocalDatetime

c# - 无法为 java 和 c# (winrt) 获得相同的 hmac_sha1 结果

WebLogic Server 上的 Java Web 应用程序内存使用情况

java - 其他流的笛卡尔积流,每个元素作为一个列表?

java - 我需要编码到 XML 我的 XML 文件中出现重复值