Как заменить 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>