簡體   English   中英

XStream 庫無法轉換 XMLGregorianCalendar

[英]XStream library unable to convert XMLGregorianCalendar

我正在嘗試將 WSDL 文件轉換為 java 類並將 java XML 請求構建為 java 對象,並嘗試使用 Xstream 庫在控制台中打印。 這里的問題是將 XML 請求作為日期時間 XML 標記作為 XMLGregoriancalender 作為數據類型。 當將 XML Java 對象傳遞給 new XStream().toxml(java object); 它提供以下錯誤。 線程“主”com.thoughtworks.xstream.converters.ConversionException 中的異常:沒有可用的轉換器。

XML 數據:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:glob="http://sap.com/xi/SAPGlobal20/Global">
   <soapenv:Header/>
   <soapenv:Body>
      <glob:PLCLogCreateRequest_sync>
         <PLCLog>
            <DateTime>2022-06-15</DateTime>
            <Lecturas>
               <BAL>4</BAL>
               <INICIO>78671.20</INICIO>
               <FINAL>146082.10</FINAL>
            </Lecturas>
            <Lecturas>
               <BAL>5</BAL>
               <INICIO>52528.20</INICIO>
               <FINAL>106812.45</FINAL>
            </Lecturas>
            <Lecturas>
               <BAL>6</BAL>
               <INICIO>44286.53</INICIO>
               <FINAL>90948.79</FINAL>
            </Lecturas>
            <Lecturas>
               <BAL>7</BAL>
               <INICIO>38912.68</INICIO>
               <FINAL>79438.60</FINAL>
            </Lecturas>
         </PLCLog>
      </glob:PLCLogCreateRequest_sync>
   </soapenv:Body>
</soapenv:Envelope>


// soap request to create PLC log

                PLCLogCreateRequestMessageSync plcLogCreateRequestMessageSync = new PLCLogCreateRequestMessageSync();
                plcLogCreateRequestMessageSync.setBasicMessageHeader(null);

                PLCLogCreateRequest plcLogCreateRequest = new PLCLogCreateRequest();

                for (HashMap<String, String> map : requiredCompleteDataInArrayList) {

                    PLCLogCreateRequestBalanceReading plcLogCreateRequestBalanceReading = new PLCLogCreateRequestBalanceReading();
                    plcLogCreateRequestBalanceReading.setBalance(map.get("BAL_VALUES").replaceAll("\\s", ""));
                    plcLogCreateRequestBalanceReading.setInico(new BigDecimal(map.get("INITIAL_LINES")));
                    plcLogCreateRequestBalanceReading.setFinal(new BigDecimal(map.get("LAST_LINES")));
                    plcLogCreateRequest.getBalanceReading().add(plcLogCreateRequestBalanceReading);
                }

                DateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
                
            String tempDate =   lastLine[0].replace("/", "-");
            System.out.println(tempDate.replace("\"", ""));
            
            
                
                Date date = format.parse(tempDate.replace("\"", ""));

                GregorianCalendar cal = new GregorianCalendar();
                cal.setTime(date);
                
                XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);

                DateTime dateTime = new DateTime();
                dateTime.setValue(xmlGregCal);

                plcLogCreateRequest.setReadingDateTime(dateTime);
                plcLogCreateRequestMessageSync.setPLCLog(plcLogCreateRequest);
                System.out.println(plcLogCreateRequestMessageSync);
                
                
                System.out.println( new XStream().toXML(plcLogCreateRequestMessageSync));

錯誤:

message             : No converter available
type                : com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl
converter           : com.thoughtworks.xstream.converters.reflection.SerializableConverter
message[1]          : Unable to make private void com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.readObject(java.io.ObjectInputStream) throws java.lang.ClassNotFoundException,java.io.IOException accessible: module java.xml does not "opens com.sun.org.apache.xerces.internal.jaxp.datatype" to unnamed module @2e005c4b
converter[1]        : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
message[2]          : Unable to make field private transient java.math.BigInteger com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.orig_eon accessible: module java.xml does not "opens com.sun.org.apache.xerces.internal.jaxp.datatype" to unnamed module @2e005c4b

tl;博士

LocalDate.parse( "2022-06-15" )

細節

您正在使用糟糕的日期時間類,這些類在幾年前被 JSR 310 中定義的現代java.time類所取代。

您的數據只有一個日期。 相反, XMLGregorianCalendar對象表示日期、時間日期和時區。 因此,該類除了是遺留的之外,不適合數據。

對於僅日期值,請使用LocalDate

您輸入的2022-06-15是標准 ISO 8601 格式的文本。 java.time中默認使用 ISO 8601 格式來解析/生成文本。 所以不需要定義格式化模式。

LocalDate ld = LocalDate.parse( "2022-06-15" ) ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM