如果秒为00,则为java.time.LocalDateTime转换问题

时间:2016-05-04 10:16:29

标签: datetime java-8 cxf

我的网络应用程序使用 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验证,并将 UnMarshaled 传递给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);
      }
    }

2 个答案:

答案 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   
使用的格式是最短的,输出省略的部分暗示为零的时间的全部值。