Ошибка во время wsimport с дополнительными привязками JAXB

Я запускаю wsimport из cmd с моими привязками данных в файле bindings.xml. В основном я пытаюсь переопределить привязку по умолчанию для типа схемы «datetime», чтобы сгенерировать «java.util.Date» вместо «XMLGregorianCalendar».

Вот команда, которую я использую.

wsimport -keep -verbose -extension -b bindings.xml -wsdllocation http://localhost/wsdl/API http://localhost:8080/cc/API?WSDL -d C:/Users/ab/Desktop/test

Мой Bindings.xml выглядит так.

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.1" >
    <globalBindings>
        <javaType name="java.util.Date" xmlType="xs:dateTime"
        parseMethod="adapter.DateAdapter.marshal"
        printMethod="adapter.DateAdapter.unmarshal" />
    </globalBindings>
</bindings>

Вот мой класс DateAdapter:

package adapter;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.bind.DatatypeConverter;

public class DateAdapter
{
    public static Date unmarshal(String paramString)
    {
        return DatatypeConverter.parseDate(paramString).getTime();
    }

    public static String marshal(Date paramDate)
    {
        Calendar localCalendar = GregorianCalendar.getInstance();
        localCalendar.setTime(paramDate);
        return DatatypeConverter.printDateTime(localCalendar);
    }
}

Запуск wsimport создает файлы webService вместе с Adapter1.class. Однако ответ содержит следующую ошибку.

C:\Users\ab\Desktop\test\org\w3\_2001\xmlschema\Adapter1.java:13: package a
dapter does not exist
        return (adapter.DateAdapter.marshal(value));

Теперь мой DateAdapter.class находится в папке «адаптер» в том же месте, где я запускаю wsimport.

Я хочу знать, почему он не может прочитать DateAdapter? Я также пытался сохранить файл в корне, а не в папке, но это тоже вызывает подобное исключение.


person Piyush    schedule 31.07.2017    source источник


Ответы (1)


Просто обновление о том, как я исправил проблему.

Я нашел два способа заставить работать преобразование даты.

В вопросе упоминается команда wsimport, используемая в обоих случаях. Кроме того, в обоих случаях я использовал jdk1.6.0_45.

<сильный>1. Не использовать собственный DateAdapter.class

В этом случае я напрямую использовал javax.xml.bind.DatatypeConverter для типа схемы datetime. Вот привязка.

<jaxb:globalBindings>
    <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
     printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
   </jaxb:globalBindings>
</jaxb:bindings>

<сильный>2. Использование собственного класса DateAdapter.class

Я понял, что использование DateAdapter.java без оператора package делает JAXB неспособным поместить импорт для DateAdapter в созданный им класс Adapter1.class. Итак, я поместил DateAdapter.java в пакет (com.test.date) и сослался на него внутри привязок с полным путем, как показано ниже.

<jaxb:globalBindings>
    <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.test.date.DateAdapter.unmarshal" 
        printMethod="com.test.date.DateAdapter.marshal"> </jaxb:javaType>
   </jaxb:globalBindings>
</jaxb:bindings>

DateAdapter.java выглядит так.

package com.test.date;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.bind.DatatypeConverter;

public class DateAdapter {
    private DateAdapter() {
    }

    public static String marshal(Date date) {
        System.out.println("Inside marshal");
        Calendar cal = GregorianCalendar.getInstance();
        cal.setTime(date);
        return DatatypeConverter.printDateTime(cal);
    }

    public static Date unmarshal(String xmlDate) {
        System.out.println("Inside unmarshal");
        return DatatypeConverter.parseDate(xmlDate).getTime();
    }

}

Теперь это вызывает ошибку компиляции, но правильно генерирует Adapter1.java (с правильным импортом DateApapter).

person Piyush    schedule 07.08.2017