2016-05-04 4 views
4

My Webapplikation Apache CXF und JAVA8 verwendet und unten Fehler in Reaktion zugewandt, wenn der Benutzer xs:datetime Eingang (00 Sekunden) alsjava.time.LocalDateTime Konvertierungsproblem, wenn Sekunden 00

<urn1:dateTimeVal>2016-04-29T20:00:00</urn1:dateTimeVal> 

senden ERROR:

org.apache.cxf.interceptor.Fault: Marshalling Error: cvc-datatype-valid.1.2.1: '2016-04-29T20:00' is not a valid value for 'dateTime'.

ich debug und analysiert, dass, wenn der Benutzer dateTimeVal als 2016-04-29T20:00:00 dann CXF Validierungen für die Eingabe senden sind vergangen und XML-Wert ist UnMarshaled bis java.time.LocalDateTime als 2016-05-05T20:00, und zum Zeitpunkt der Antwort die Antwort, die Marshalling Fehler tritt aufgrund von Verlust von Sekunden Teil (00).

Jede Hilfe/Hinweis wird geschätzt.

P. S: Sie können mit folgenden Schnipsel versuchen:

java.time.LocalDateTime dt= java.time.LocalDateTime.of(2016, Month.MAY, 5, 20, 00, 00); 
    System.out.println(dt); 

Hinweis: Über Codebeispiel nur für das Verständnis ist Datetime-Wert zu drucken. Aber tatsächliche Rückgabetyp erwartet in Web-Anwendung ist java.time.LocalDateTime

OUTPUT ERWARTET: 2016-05-05T20: 00: 00

OUTPUT IST: 2016-05-05T20: 00

EDIT: die Bindung (JAXB) Inhalt für das Feld ist:

@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; 

UND LocalDateTimeAdapter Die Datei ist

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

Konvertieren Sie von LocalDateTime zu String mit 'toString()' an einem bestimmten Punkt? – assylias

+0

Nein, die gesamte interne Konvertierung erfolgt nur zwischen CXF und Java. –

+0

Haben Sie eine Jaxb-Bindings-Datei, Jaxb-Annotationen in Ihrem Pojo oder irgendeine Art von Marshalling-Adapter, die Sie uns nicht zeigen? –

Antwort

2

Möglicherweise möchten Sie verwenden

System.out.println (DateTimeFormatter.ISO_LOCAL_DATE_TIME.format (dt)); 

Es gibt:

2016-05-05T20:00:00 
+0

Als Antwort sollte es als 'java.time.LocalDateTime' Typ, aber nicht' String' zurückgegeben werden, der mit 'DateTimeFormatter.ISO_LOCAL_DATE_TIME.format (dt)' zurückgegeben wird. –

+0

+1: Scheint, Problem ist in der 'LocalDateTimeAdapter.print' Methode. 'return value.toString()' sollte 'return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format (value)' sein; Ich werde versuchen zu sehen, ob es funktioniert! –

+0

Für JAXB benötigen Sie eine Adapterklasse, die in der XJB-Bindungsdatei definiert ist. Z.B. '' (mit Joda-Zeit anstelle von Java8 DT). Siehe https://github.com/phax/peppol-commons/tree/master/peppol-commons für das gesamte Projekt-Setup. –

1

Das Problem scheint in LocalDateTimeAdapter.print() zu sein. LocalDateTime.toString() lässt die Sekunden, wenn der Sekundenwert 0.

ist Wenn Sie es

public static String print(LocalDateTime value) 
{ 
    return value.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); 
} 

es die Sekunden liefert auch ändern, wenn Marshalling.

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)); 

Die Ausgabe, die es gibt, ist

2016-01-01T00:00 
2016-01-01T00:00:00 

In der Dokumentation für LocalDateTime.toString() es erklärt dieses Verhalten::

Um ein schnelles Beispiel, beachten Sie die Ergebnisse des folgenden Ausschnitt sehen

The output will be one of the following ISO-8601 formats:
- 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
The format used will be the shortest that outputs the full value of the time where the omitted parts are implied to be zero.

+0

Ich habe die verbindlichen Inhaltsdetails in der Frage hinzugefügt. Bitte beachten Sie den Abschnitt ** EDIT **: für Details. –

Verwandte Themen