Java jaxb使用自定义日期格式编组LocalDate
我在这里关注了一个话题,但它没有回答我的问题。 我希望soap响应将localdate格式化为soap请求中相同的localdate 例如:我的localdate请求:1990年10月10日 响应需要是1990年10月10日,但我总是得到1990年10月10日,因为toString的格式是这样的 我的代码:Java jaxb使用自定义日期格式编组LocalDate,java,jaxb,localdate,Java,Jaxb,Localdate,我在这里关注了一个话题,但它没有回答我的问题。 我希望soap响应将localdate格式化为soap请求中相同的localdate 例如:我的localdate请求:1990年10月10日 响应需要是1990年10月10日,但我总是得到1990年10月10日,因为toString的格式是这样的 我的代码: public class LocalDateAdapter extends XmlAdapter<String, LocalDate> { public DateTimeFor
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();
}
}
但结果是:
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;
}
这只适用于一种格式。。。如果我添加另一个,例如:DateTimeFormatter mmddyyyy=DateTimeFormatter.of模式MM-dd-yyyy;并将其附加到格式化程序中,我将得到:05/05/199005-05-1990:@TiagoMachado在原始帖子中,marshal始终是一个ISO-8601格式的结果,因为它只是在日期返回到字符串。您需要使用与所需格式对应的格式化程序,以使其以不同的方式打印。但是,您的评论表明,您有一个更高级别的要求,即跟踪原始日期格式,以确定要格式化的输出。这需要更多的参与,并且取决于您处理这些消息的周围环境。但我会给出一个简单的例子来说明我的意思。这是一个很好的答案,但有一个问题,我有一个字段:private LocalDate birthdate;所以,当我做我的请求时,我可以键入我想要的任何日期格式。当我使用该服务从有生日的人那里获取数据时,它应该以我请求的格式提供给我。它应该只使用1个字段工作…:
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;
}