jaxb marshalling LocalDate с пользовательским форматом даты - PullRequest
0 голосов
/ 05 июля 2019

Я следил за темой здесь, но она не отвечает на мой вопрос. Я хочу, чтобы ответ мыла форматировал локальную дату в ту же локальную дату в запросе мыла.

например: мой запрос на локальную дату: 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 (

1 Ответ

1 голос
/ 05 июля 2019

Попробуйте использовать ваш метод 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;
}
...