von XMLGregorianCalendar Datum/Kalender fügt zusätzliche Zeit/unerwünschte
Entwickle ich einen client an einen web-Dienst, der entlarvt (.wsdl -) Vertrag, erfordert yyyy-MM-dd-format für 1 auf die request-Parameter , jedoch automatisch generierten POJOS basiert auf der .wsdl erstellen Sie das Attribut "Datum" als Typ XMLGregorianCalendar.
Mein Problem ist NICHT die Konvertierung zu oder von XMLGregorianCalendar siehe mein Dienstprogramm unten:
public static XMLGregorianCalendar toXMLGregorianCalendar(Calendar c){
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeInMillis(c.getTimeInMillis());
XMLGregorianCalendar xc= null;
try {
xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
} catch (DatatypeConfigurationException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return xc;
}
Mein Problem ist der Weg von XMLGregorianCalendar Datum/Kalender fügt zusätzliche Zeit/nicht mehr benötigte Daten zu meinem yyyy-MM-dd beim Aufruf Kalender.getTime();
In einem bestimmten code-segment, die ich brauche, um zu gehen von XMLGregorianCalendar bisher
if (repairOrderType.getCloseDate() != null) {
LOG.debug("ServiceHistoryMapper, processRepairOrders() , repairOrderType.getCloseDate() BEFORE:"
+ repairOrderType.getCloseDate());
String date = repairOrderType.getCloseDate().getYear() + "-"
+ repairOrderType.getCloseDate().getMonth() + "-"
+ repairOrderType.getCloseDate().getDay();
//Approach #1, trying to remove hour,minute,sec values by calendar.clear() method , not successful
Calendar calendar = Calendar.getInstance();
calendar.set(repairOrderType.getCloseDate().getYear(),
repairOrderType.getCloseDate().getMonth(),
repairOrderType.getCloseDate().getDay());
calendar.clear(Calendar.HOUR);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
/*Approach#2 , trying to remove hour,minute,sec values using SimpleDateFormat ,
* also not successful. SimpleDateFormat or DateFormat are use to format String output NOT remove internal data
*
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = formatter.getCalendar();
calendar.set(repairOrderType.getCloseDate().getYear(),
repairOrderType.getCloseDate().getMonth(),
repairOrderType.getCloseDate().getDay());
*/
LOG.debug("ServiceHistoryMapper, processRepairOrders() , repairOrderType.getCloseDate() AFTER:"
+ calendar.getTime());
repairOrder.setCloseDate(calendar.getTime());
}
Ausgabe:
27-Nov-2012 18:10:39.743 DEBUG com.tms.Besitzer.- integration.nsh.mapping.ServiceHistoryMapper - ServiceHistoryMapper, processRepairOrders() , repairOrderType.getCloseDate() VOR:2012-04-30
27-Nov-2012 18:10:51.413 DEBUG com.tms.Besitzer.- integration.nsh.mapping.ServiceHistoryMapper - ServiceHistoryMapper, processRepairOrders() , repairOrderType.getCloseDate() NACH:mi Mai 30 18:00:00 PDT 2012
Wie Sie oben sehen können, BEVOR Datum VOR:2012-04-30 und NACH Datum Mai 30 18:00:00 PDT 2012 mit unerwünschten Stunden "18:00:00 PDT".
Unten ist meine eigentliche XML-Anfrage an den Dienst gesendet:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns4:VehicleServiceHistoryDetails
xmlns="urn:tms.toyota.com/Components" xmlns:ns2="urn://esb.ari.xxxxxx.com/2008/12/10/schemas/common/Customer"
xmlns:ns3="urn:incentives.ari.xxxxxx.com/StandardHeader"
xmlns:ns4="urn://esb.ari.xxxxxx.com/2008/12/10/schemas/History"
xmlns:ns5="http://ice.ari.xxxxxx.com/EMF" xmlns:ns6="urn:ari.xxxxxx.com/rtmheader">
<ns5:ApplicationArea>
<ns5:CreationDateTime>2012-11-27T18:11:23.071-08:00
</ns5:CreationDateTime>
<ns5:Sender />
<ns5:UserArea />
</ns5:ApplicationArea>
<ns4:VehicleServiceHistoryDataArea>
<ns4:VehicleServiceHistoryHeader>
<ns3:TimeStamp>2012-11-27T18:11:23.071-08:00</ns3:TimeStamp>
<ns3:SourceSystem>TOO</ns3:SourceSystem>
<ns4:SourceKey>TOY1TWXE</ns4:SourceKey>
</ns4:VehicleServiceHistoryHeader>
<ns4:VehicleServiceHistory>
<ns4:VIN>XXXXXXXXXXXXXXXX</ns4:VIN>
<ns4:RepairOrder>
<ns2:RepairOrderDealer>
<DealerNumber>29059</DealerNumber>
</ns2:RepairOrderDealer>
<ns2:RepairOrderNumber>0088745</ns2:RepairOrderNumber>
<ns2:CloseDate>2012-05-30-07:00</ns2:CloseDate>
</ns4:RepairOrder>
</ns4:VehicleServiceHistory>
</ns4:VehicleServiceHistoryDataArea>
</ns4:VehicleServiceHistoryDetails>
</S:Body>
</S:Envelope>
Sehen Sie in der request-xml in der 2012-05-30-07:00 das extra "-07:00" - Daten Hinzugefügt wird, ich möchte nur 2012-05-30.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die im Kontext von XML-Datentypen die XMLGregorianCalendar wird erstellt, über factory-Methoden in javax.xml.datatype.DatatypeFactory das scheint eine Methode namens newXMLGregorianCalendarDate(int Jahr, int Monat, int Tag, int timezone);
So habe ich eine utility-Methode :
Das Problem ist jetzt gelöst, bekommen wir die gewünschte yyyy-MM-ddd.
Kann man auch schreiben es in der folgenden Art und Weise, welche mehr lesbar:
Ich verwendete den folgenden code, um zu lösen das gleiche problem.
versuchen.
Wenn Sie mit javax.xml.binden.Marshaller vorbereiten SOAP-body, dann die Wurzel des unerwünschten bahavior ist in dir xlmns:ns2. Das Feld ns2:CloseDate ist der Typ (oder eine andere Art wichich unter anderem um Datum und Zeit):
ändern Sie es in (oder andere Datum ohne Uhrzeit (Stunde und minute):
Wenn Sie es nicht schafft, diese xlmns, einfach akzeptieren, dass dir CloseDate müssen Zeit haben, definiert. Ohne es als web-service hätte unapropiate Zeit Erklärung (ich weiß nicht genau den Wert, aber ich Wette auf 0:00)