В настоящее время я работаю над RESTful API. У меня есть класс Employee и класс EmployeeResource. У меня также есть собственный DateAdapter, который меняет мои свойства Date на длинные метки времени. Однако в моих ответах JSON метки времени отображаются в виде строк (заключенных в двойные кавычки), а не в числа (без двойных кавычек). Вот сокращенная версия моего кода и записанный ответ JSON ...
Пользовательский DateAdapter
public class DateAdapter extends XmlAdapter<Long, Date> {
@Override
public Date unmarshal(Long v) throws Exception {
return new Date(Long.valueOf(v));
}
@Override
public Long marshal(Date v) throws Exception {
return v.getTime();
}
}
Класс сущности
@Entity
@javax.xml.bind.annotation.XmlRootElement
@XmlType(propOrder={"createdOn","empId"})
public class Employee implements Serializable {
private Date createdOn;
private Integer empId;
@Column(nullable=false)
@Temporal(TemporalType.TIMESTAMP)
@XmlJavaTypeAdapter(DateAdapter.class)
public Date getCreatedOn() {
return createdOn;
}
public void setCreatedOn(Date createdOn) {
this.createdOn = createdOn;
}
@Id
@XmlID
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
}
EmployeeResource
@Path("/Employees")
@javax.xml.bind.annotation.XmlRootElement
@XmlType(propOrder={"hateoas","employees"})
public class EmployeeResource {
List<Employee> employees;
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
@GET
@Path("/{id}")
@Produces("application/json")
public Response getEmployee(@Context UriInfo ui, @PathParam("id") Integer id) {
Session session = HibernateUtil.getSession();
session.beginTransaction();
Criteria criteria=session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("empId", new Integer(10150)));
this.employees = criteria.list();
return Response.ok(this).build();
}
}
Текущий ответ JSON
{
"employees":{
"createdOn":"1330915130163",
"empId":"10150"
}
}
Ожидаемый ответ JSON
{
"employees":{
"createdOn":1330915130163,
"empId":10150
}
}
Я предполагаю, что есть какой-то способ запретить JAXB или JAX-RS заключать все числа в кавычки. Может ли кто-нибудь направить меня туда, где я могу это настроить?
Заранее спасибо!
РЕДАКТИРОВАТЬ # 1 2012.03.07
Итак, после некоторого дополнительного исследования, я думаю, что моя проблема связана с используемой по умолчанию JSONConfiguration.Notation, MAPPED. Похоже, что NATURAL JSONConfiguration.Notation даст мне то, что я хочу. Однако я не нашел четкого примера того, как применять это приложение в широком масштабе. Я предполагаю, что я бы указал это в своем классе ApplicationConfig, который расширяет javax.ws.rs.core.Application.
РЕДАКТИРОВАТЬ № 2 2012.03.10
Итак, после некоторого исследования я решил использовать библиотеку JSON-анализатора, Джексон. Кажется, это наиболее полное решение JSON, использующее только конфигурацию по умолчанию. По умолчанию даты переводятся в соответствующие им временные метки и сериализуются в виде чисел (без кавычек). Единственный недостаток, с которым я столкнулся, это то, что Джексон в настоящее время не поддерживает аннотации JAXB, "@XmlID" и "@XmlIDREF". Поскольку в моей модели данных есть прямые ссылки на себя (не показано выше), я создал еще один вопрос для обсуждения. Если кому-то интересно нажмите здесь, чтобы перейти к этой теме ...