#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();
}
}