Как заменить XmlGregorianCalendar по дате?
Я должен предоставить сервисный слой ejb через jax-ws .
Я сгенерировал веб-сервис, используя jax-ws и wsimport, но меня останавливали странные вещи; Дата отображается в XmlGregorianCalendar. Можно ли вместо этого использовать классическую Java-дату? Можете ли вы показать мне правильный путь?
Благодарю. Редактировать: это файл привязки, который я использовал: спасибо, я немного изменил ваш xml и прикрепил его с помощью netbeans к веб-сервису клиента, и это сработало. Этот переплет я использовал:
<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>
2 ответа
Не проверено, но должно работать. Сначала создайте такой класс:
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?
Спасибо, Томаш. Вышеупомянутое решение работает.
Но 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>