Как заменить XmlGregorianCalendar по дате?
Мне нужно разоблачить уровень сервиса ejb через jax-ws.
Я создал веб-сервис, используя jax-ws и wsimport, но меня останавливают странные вещи; Дата сопоставляется с XmlGregorianCalendar.
Можно ли вместо этого использовать классическую дату Java?
Можете ли вы показать мне правильный путь?
Спасибо.
Редактировать:
это файл привязки, который я использовал:
спасибо, я немного изменил ваш xml и привязал его к netbeans клиентскому webservice, и он сработал. Это привязка, которую я использовал:
<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" wsdlLocation="../wsdl/localhost_8080/web_test/Testor.wsdl" >
<jaxb:globalBindings>
<jaxb:javaType name="java.util.Date"
xmlType="xsd:dateTime"
parseMethod="lol.XsdDateTimeConverter.unmarshal"
printMethod="lol.XsdDateTimeConverter.marshalDateTime"
/><jaxb:javaType
name="java.util.Date"
xmlType="xsd:date"
parseMethod="lol.XsdDateTimeConverter.unmarshal"
printMethod="lol.XsdDateTimeConverter.marshalDate"
/>
</jaxb:globalBindings>
</jaxws:bindings>
Ответы
Ответ 1
Не тестировалось, но должно работать. Сначала создайте такой класс:
import javax.xml.bind.DatatypeConverter;
public class XsdDateTimeConverter {
public static Date unmarshal(String dateTime) {
return DatatypeConverter.parseDate(dateTime).getTime();
}
public static String marshalDate(Date date) {
final GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
return DatatypeConverter.printDate(calendar);
}
public static String marshalDateTime(Date dateTime) {
final GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(dateTime);
return DatatypeConverter.printDateTime(calendar);
}
}
Затем добавьте это в пользовательский xjb
файл:
<javaType
name="java.util.Date"
xmlType="xs:dateTime"
parseMethod="XsdDateTimeConverter.unmarshal"
printMethod="XsdDateTimeConverter.marshalDateTime"
/>
<javaType
name="java.util.Date"
xmlType="xs:date"
parseMethod="XsdDateTimeConverter.unmarshal"
printMethod="XsdDateTimeConverter.marshalDate"
/>
</globalBindings>
Не тестировалось, но должно работать. Основываясь на моем ответе здесь: JAX-WS и Joda-Time?
Ответ 2
Спасибо Томаш. Вышеупомянутое решение работает.
Но wsimport также добавляет свой набор адаптеров, таких как Adapter1.java и Adapter2.java со своим пакетом org.w3._2001.xmlschema, который действительно не соответствует моей собственной структуре пакетов.
Я нашел способ изменить это имя пакета, используя другое связывание jaxb. На самом деле, я много искал и не мог найти это легко, поэтому я добавляю его здесь для тех, кто ищет то же самое.
Добавьте следующую привязку в wsimport, используя '-b binding.xml'. Обратите внимание, что wsimport может работать с несколькими файлами привязки.
binding.xml ниже:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<annotation><appinfo>
<jaxb:schemaBindings>
<jaxb:package name="com.abc.xyz.utils"/>
</jaxb:schemaBindings>
</appinfo></annotation>
</schema>