我的网络应用程序使用 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'不是有效值 '日期时间'。
我调试并分析了如果用户将dateTimeVal
发送为2016-04-29T20:00:00
,则会传递对输入的CXF验证,并将java.time.LocalDateTime
2016-05-05T20:00
1}},并且在返回响应时,由于丢失秒(00)而发生 Marshaling 错误。
感谢任何帮助/提示。
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
OUTPUT ACTUAL :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;
AND 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);
}
}
答案 0 :(得分:3)
您可能想要使用
System.out.println (DateTimeFormatter.ISO_LOCAL_DATE_TIME.format (dt));
它给出了:
2016-05-05T20:00:00
答案 1 :(得分:2)
问题似乎出现在LocalDateTimeAdapter.print()
中。 LocalDateTime.toString()
省略秒值为0时的秒数。
如果您将其更改为
public static String print(LocalDateTime value)
{
return value.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}
它将在编组时提供秒数。
要查看快速示例,请注意以下代码段的结果:
System.out.println(LocalDateTime.of(2016,1,1,0,0,0,0).toString());
System.out.println(LocalDateTime.of(2016,1,1,0,0,0,0).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
它给出的输出是
2016-01-01T00:00
2016-01-01T00:00:00
在LocalDateTime.toString()
的文档中,它解释了这种行为:
输出将是以下ISO-8601格式之一:
- uuuu-MM-dd'T'HH:mm
- uuuu-MM-dd'T'HH:mm:ss
- uuuu-MM-dd'T'HH:mm:ss.SSS
- uuuu-MM-dd'T'HH:mm:ss.SSSSSS
- uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS
使用的格式是最短的,输出省略的部分暗示为零的时间的全部值。