我的网页应用程序正在使用 Apache CXF 和 JAVA8,如果用户发送 xs:datetime
输入(秒 00),则会在响应中面临以下错误
<urn1:dateTimeVal>2016-04-29T20:00:00</urn1:dateTimeVal>
错误:
org.apache.cxf.interceptor.Fault: 编组错误:cvc-datatype-valid.1.2.1:“2016-04-29T20:00”不是“dateTime”的有效值。
经过调试和分析,如果用户将dateTimeVal
设置为2016-04-29T20:00:00
,则 CXF 对输入进行的验证通过,并将 XML 值反编组到java.time.LocalDateTime
中,其值为2016-05-05T20:00
,并在返回响应时发生编组错误,因为秒数部分(00)丢失了。
欢迎提供任何帮助或提示。
P.S. :您可以尝试以下片段:
java.time.LocalDateTime dt= java.time.LocalDateTime.of(2016, Month.MAY, 5, 20, 00, 00);
System.out.println(dt);
注意:以上代码示例仅用于理解如何打印日期时间值。但在Web应用程序中,预期的实际返回类型是java.time.LocalDateTime
。
期望输出:2016-05-05T20:00:00
实际输出:2016-05-05T20:00
编辑:该字段的绑定(JAXB)内容为:
@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
@XmlSchemaType(name = "dateTime")
@Generated(value = "com.sun.tools.xjc.Driver", date = "2016-05-03T05:28:57+05:30", comments = "JAXB RI v2.2.11")
@NotNull
protected LocalDateTime dateTimeVal;
并且 LocalDateTimeAdapter
文件是
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.TemporalAccessor;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class LocalDateTimeAdapter
extends XmlAdapter<String, LocalDateTime>
{
public static LocalDateTime parse(String value)
{
DateTimeFormatter dateTimeAndZoneformatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
DateTimeFormatter dateTimeformatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
TemporalAccessor ta = null;
try
{
ta = dateTimeformatter.parse(value);
}
catch (DateTimeParseException ex)
{
ta = dateTimeAndZoneformatter.parse(value);
}
return LocalDateTime.from(ta);
}
public static String print(LocalDateTime value)
{
return value.toString();
}
public LocalDateTime unmarshal(String value)
{
return parse(value);
}
public String marshal(LocalDateTime value)
{
return print(value);
}
}
toString()
将 LocalDateTime 转换为 String? - assylias