我有幾個wsdl文件差不多有幾百個。每當我爲它們創建客戶端jaxb客戶端類時,Jaxb會自動將所有日期/時間字段映射到XMLGregorianCalender。經過大量的搜索,我發現提供一個單獨的綁定文件是唯一的解決方案。WSDL自定義:XMLGregorianCalender到java.util.Date
我不想提供wsdl位置,因爲我有這麼多,否則我必須爲每個wsdl創建一個單獨的綁定文件。
下面是我使用的綁定文件。
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" >
<globalBindings>
<javaType name="java.util.Date" xmlType="xsd:dateTime" />
</globalBindings>
</bindings>
它創造了JAXB類有日期類型,但它也創造了自動調用Adapter1.java適配器這是擺在我不想要的。我有我自己的包結構,不能偏離它。
org.w3._2001.xmlschema
與此適配器日期從字符串轉換爲java.util.Date和作爲轉換器應該從XMLGregorianCalender轉換爲java.util.Date我的應用程序失敗
所以,我寫了一個適配器自己
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Calendar;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DateAdapter extends XmlAdapter<XMLGregorianCalendar, Date> {
@Override
public XMLGregorianCalendar marshal(Date date) throws Exception {
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
return xmlGregorianCalendar;
}
@Override
public Date unmarshal(XMLGregorianCalendar xmlGregorianCalendar) throws Exception {
return xmlGregorianCalendar.toGregorianCalendar().getTime();
}
}
,並改變了我的自定義文件是這樣的:
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" >
<globalBindings>
<javaType name="java.util.Date" xmlType="xsd:dateTime"
parseMethod="DateAdapter.marshal"
printMethod="DateAdapter.unmarshal" />
</globalBindings>
</bindings>
然後我運行了wsimport工具,失敗了。
C:\Users\stuart\Desktop\code>wsimport -s src -d gen -b cust.txt http://localhost:8080/webservice-jaxws/DummyService?wsdl
parsing WSDL...
generating code...
compiling code...
C:\Users\stuart\Desktop\code\src\org\w3\_2001\xmlschema\Adapter1.java:13: cannot find symbol
symbol : variable DateAdapter
location: class org.w3._2001.xmlschema.Adapter1
return (DateAdapter.marshal(value));
^
C:\Users\stuart\Desktop\code\src\org\w3\_2001\xmlschema\Adapter1.java:17: cannot find symbol
symbol : variable DateAdapter
location: class org.w3._2001.xmlschema.Adapter1
return (DateAdapter.unmarshal(value));
^
2 errors
compilation failed, errors should have been reported
而且我一直在我的自定義設置在cust.txt作爲wsimport的命令給出了,我DateAdapter類的源文件也是在同一目錄中。班上沒有包。以下是我的目錄結構。
³ cust.txt
³ DateAdapter.java
³
ÃÄÄÄgen
³ ÃÄÄÄorg
³ ³ ÀÄÄÄw3
³ ³ ÀÄÄÄ_2001
³ ³ ÀÄÄÄxmlschema
³ ³ Adapter1.class
³ ³
³ ÀÄÄÄwebservice
³ ÀÄÄÄjaxws
³ ÀÄÄÄgenerated
³ GetBook.class
³ GetBookResponse.class
³ ObjectFactory.class
³ package-info.class
³ Book.class
³ BookService.class
³ BookServiceImpl.class
³ ReturnBook.class
³ ReturnBookResponse.class
³
ÀÄÄÄsrc
ÃÄÄÄorg
³ ÀÄÄÄw3
³ ÀÄÄÄ_2001
³ ÀÄÄÄxmlschema
³ Adapter1.java
³
ÀÄÄÄwebservice
ÀÄÄÄjaxws
ÀÄÄÄgenerated
GetBook.java
GetBookResponse.java
ObjectFactory.java
package-info.java
Book.java
BookService.java
BookServiceImpl.java
ReturnBook.java
ReturnBookResponse.java