我在这里关注了一个主题,但它没有回答我的问题。 我希望肥皂响应将本地日期格式化为肥皂请求中相同的本地日期。
例如:我的本地日期请求: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/