2017-07-31 57 views
0

我正在運行wsimport從cmd與我的dataBindings在bindings.xml文件。基本上我試圖覆蓋「datetime」模式類型的默認綁定,以生成「java.util.Date」而不是「XMLGregorianCalendar」。wsimport在附加JAXB綁定期間出錯

這是我使用的命令。

wsimport -keep -verbose -extension -b bindings.xml -wsdllocation http://localhost/wsdl/API http://localhost:8080/cc/API?WSDL -d C:/Users/ab/Desktop/test 

我的Bindings.xml看起來像這樣。

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.1" > 
    <globalBindings> 
     <javaType name="java.util.Date" xmlType="xs:dateTime" 
     parseMethod="adapter.DateAdapter.marshal" 
     printMethod="adapter.DateAdapter.unmarshal" /> 
    </globalBindings> 
</bindings> 

這裏是我DateAdapter類:

package adapter; 

import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import javax.xml.bind.DatatypeConverter; 

public class DateAdapter 
{ 
    public static Date unmarshal(String paramString) 
    { 
     return DatatypeConverter.parseDate(paramString).getTime(); 
    } 

    public static String marshal(Date paramDate) 
    { 
     Calendar localCalendar = GregorianCalendar.getInstance(); 
     localCalendar.setTime(paramDate); 
     return DatatypeConverter.printDateTime(localCalendar); 
    } 
} 

運行的wsimport生成web服務文件用Adapter1.class一起。但是,該響應包含以下錯誤。

C:\Users\ab\Desktop\test\org\w3\_2001\xmlschema\Adapter1.java:13: package a 
dapter does not exist 
     return (adapter.DateAdapter.marshal(value)); 

現在,我的DateAdapter.class位於文件夾「適配器」在相同的位置我正在運行wsimport從。

我想知道爲什麼它無法讀取DateAdapter?我也嘗試將文件保存在根目錄中而不是文件夾中,但也引發了類似的異常。

回答

1

只是我如何解決問題的更新。

我發現了兩種方法來進行日期轉換。

問題中提到了在這兩種情況下使用的wsimport命令。另外,我在兩種情況下都使用了jdk1.6.0_45。

1.不使用自定義DateAdapter.class

在這種情況下,我直接使用javax.xml.bind.DatatypeConverter的日期時間模式類型。這是綁定。

<jaxb:globalBindings> 
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" 
    printMethod="javax.xml.bind.DatatypeConverter.printDateTime" /> 
    </jaxb:globalBindings> 
</jaxb:bindings> 

2.使用自定義DateAdapter.class

我想通,使用DateAdapter.java沒有包語句讓JAXB不能夠把進口的DateAdapter在Adapter1.class那它產生。 因此,我把DateAdapter.java放在一個包(com.test.date)中,並在綁定中用下面的完整路徑引用它。

<jaxb:globalBindings> 
    <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.test.date.DateAdapter.unmarshal" 
     printMethod="com.test.date.DateAdapter.marshal"> </jaxb:javaType> 
    </jaxb:globalBindings> 
</jaxb:bindings> 

DateAdapter.java看起來像這樣。現在

package com.test.date; 

import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import javax.xml.bind.DatatypeConverter; 

public class DateAdapter { 
    private DateAdapter() { 
    } 

    public static String marshal(Date date) { 
     System.out.println("Inside marshal"); 
     Calendar cal = GregorianCalendar.getInstance(); 
     cal.setTime(date); 
     return DatatypeConverter.printDateTime(cal); 
    } 

    public static Date unmarshal(String xmlDate) { 
     System.out.println("Inside unmarshal"); 
     return DatatypeConverter.parseDate(xmlDate).getTime(); 
    } 

} 

,這並不拋出一個編譯錯誤,但它正確生成Adapter1.java(用正確的DateApapter進口)。