[英]jaxb marshalling LocalDate with custom date format
我在這里關注了一個話題,但沒有回答我的問題。 我希望soap響應將localdate格式設置為soap請求中的相同localdate。
例如:我的本地日期請求: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 :(
嘗試使用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.