Возврат данных при использовании Spring 3, ReST и XML с типами даты Joda

#java #spring #rest #jodatime

#java #spring #rest #jodatime

Вопрос:

У меня возникла странная проблема в простом веб-сервисе, созданном с использованием Spring 3 и MVC. Веб-служба работает нормально, и я получаю XML обратно так, как я хочу, однако все значения для всех типов даты / времени Joda пусты.

Итак, у меня есть UserDTO, который выглядит примерно так:

 @XmlRootElement(name = "user")
public class UserDTO
{
  private String firstname;
  private String lastname;
  private LocalDate birthdate;
  ...
  

И у меня есть контроллер, подобный:

 @Controller
public class UserController
{
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    @ResponseBody
    public UserDTO getUser()
    {
        UserDTO userDTO = new UserDTO();
        userDTO.setFirstname("Foo");
        userDTO.setLastname("Bar");
        userDTO.setBirthdate(new LocalDate(1980,1,1));
        return userDTO;
    }
}
  

Я получаю следующий XML обратно:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
  <firstname>Foo</firstname>
  <lastname>Bar</lastname>
  <birthdate />
</user>
  

Если я изменю заголовок ‘Accept’ на application / json, я действительно получу значение даты

{«UserVO»:{«Имя пользователя», «Фамилия»: «Фамилия», «дата рождения»: [1978,12,5]}}

Есть идеи о том, что это может быть?

Комментарии:

1. и как вы сопоставляете UserDTO с XML?

2. Это происходит автоматически через JAXB и Spring 3 с использованием аннотации @XmlRootElement AFAIK. Все, что мне нужно было сделать, чтобы добавить поддержку JSON, — это добавить библиотеку Jackson json в мой classpath

Ответ №1:

Чтобы ответить на мой собственный вопрос… следующая ссылка указала мне правильный путь:http://bdoughan.blogspot.com/2011/05/jaxb-and-joda-time-dates-and-times.html

По сути, вам нужно создать XmlAdapter для каждого типа. Вот пример из ссылки:

 package blog.jodatime;

import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.joda.time.DateTime;

public class DateTimeAdapter 
    extends XmlAdapter<String, DateTime>{

    public DateTime unmarshal(String v) throws Exception {
        return new DateTime(v);
    }

    public String marshal(DateTime v) throws Exception {
        return v.toString();
    }

}