Как заменить 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>
Другие вопросы по тегам