Настройка WSDL: XMLGregorianCalender для java.util.Date
У меня есть несколько файлов WSDL почти сотни. Всякий раз, когда я создаю клиентские jaxb-клиентские классы для них, Jaxb автоматически сопоставляет все поля даты / времени с XMLGregorianCalender. После долгих поисков я обнаружил, что предоставление отдельного файла привязки - единственное решение.
Я не хочу указывать местоположение 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 с типами Date, но также автоматически создал адаптер с именем Adapter1.java, который был помещен в который я не хочу. У меня есть своя структура пакета, и я не могу от нее отклоняться.
org.w3._2001.xmlschema
и этот адаптер преобразует дату из String в 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
1 ответ
Решил это, используя ту же декларацию привязок, что и вы, за исключением того, что мой DateAdapter на самом деле выглядел так:
public class DateAdapter {
private DateAdapter() {}
public static String marshal(Date date) {
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(date);
return DatatypeConverter.printDateTime(cal);
}
public static Date unmarshal(String xmlDate) {
return DatatypeConverter.parseDate(xmlDate).getTime();
}
}
И это работает как шарм. XML сторона у меня есть dateTime и Java сторона у меня есть java.util.Date. Я фактически сделал другой, который использует java.time.Instant вместо Date, с которым мне легче работать.