Отображение Java Date Object в XML-схему формата даты и времени - PullRequest
7 голосов
/ 25 апреля 2011

У меня возникла проблема с отображением типа данных Java в стандартный тип данных Schema Date.

У меня есть простой класс, который я аннотировал вот так. Переменная экземпляра периода имеет тип объекта Java Date.

@XmlAccessorType(value = XmlAccessType.NONE)
public class Chart {
    @XmlElement
    private double amount;
    @XmlElement
    private double amountDue;
    @XmlElement
    private Date period;
    //constructor getters and setters
}

Вот мой веб-сервис

@WebService
public class ChartFacade {
    @WebMethod
    public Chart getChart() throws ParseException {
      SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
      Chart chart = new Chart(20.0,20.5, df.parse("2001-01-01"));
      return chart;
    }
}

Моя проблема в том, что он возвращает данные даты в формате, который не соответствует ожидаемому.

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getChartResponse xmlns:ns2="http://ss.ugbu.oracle.com/">
         <return>
            <amount>20.0</amount>
            <amountDue>20.5</amountDue>
            **<period>2001-01-01T00:01:00+08:00</period>**
         </return>
      </ns2:getChartResponse>
   </S:Body>
</S:Envelope>

Я хотел, чтобы элемент period возвращался так

<period>2001-01-01</period>

Есть ли способ, которым я могу этого достичь?

Ответы [ 3 ]

8 голосов
/ 25 апреля 2011

Вы можете сделать следующее для управления типом схемы:

@XmlElement
@XmlSchemaType(name="date")
private Date period;

Для получения дополнительной информации:

7 голосов
/ 25 апреля 2011

Используйте @ XmlJavaTypeAdapter аннотацию, и вы можете маршалировать / демаршировать свои поля любым удобным для вас способом.

Не могу определить, является ли это наиболее простым способом.

И обратите внимание такжечто это может повредить совместимости с любым кодом, который попытается использовать ваш WSDL.Программисты для этого другого кода увидят xsd: string в качестве типа поля и, следовательно, должны будут выполнить форматирование и синтаксический анализ вручную (точно так же, как вы, да), представляя, кто знает, сколько ошибок.Поэтому, пожалуйста, подумайте, действительно ли xsd: date - плохой выбор.

Украдено из здесь :

@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
Date someDate;
...

public class DateAdapter extends XmlAdapter<String, Date> {

    // the desired format
    private String pattern = "MM/dd/yyyy";

    public String marshal(Date date) throws Exception {
        return new SimpleDateFormat(pattern).format(date);
    }

    public Date unmarshal(String dateString) throws Exception {
        return new SimpleDateFormat(pattern).parse(dateString);
    }   
}

ОБНОВЛЕНИЕ : как было упомянуто@Blaise Doughan, гораздо более коротким способом является аннотировать дату с помощью

@XmlSchemaType("date")
Date someDate;

Несмотря на то, что до сих пор неясно, почему информация о часовом поясе не генерируется для этой даты, этот код работает на практике и требует гораздо меньшего количества операций ввода.

0 голосов
/ 25 апреля 2011

Ваш конструктор Chart, кажется, анализирует отформатированную строку даты обратно в Date, который затем сериализуется с использованием формата по умолчанию для ответа XML.Я думаю, что использование private String period; (и исправление конструкторов) должно работать

...