У меня есть класс сотрудников, аннотированный JAXB:
@XmlRootElement(name = "employee")
public class Employee {
private Integer id;
private String name;
...
@XmlElement(name = "id")
public int getId() {
return this.id;
}
... // setters and getters for name, equals, hashCode, toString
}
И объект ресурса JAX-RS (я использую Джерси 1.12)
@GET
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/")
public List<Employee> findEmployees(
@QueryParam("name") String name,
@QueryParam("page") String pageNumber,
@QueryParam("pageSize") String pageSize) {
...
List<Employee> employees = employeeService.findEmployees(...);
return employees;
}
Эта конечная точка работает нормально. Я получаю
<employees>
<employee>
<id>2</id>
<name>Ana</name>
</employee>
</employees>
Однако, если я изменю метод, чтобы вернуть объект Response
, и поместите список сотрудников в тело ответа, например:
@GET
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/")
public Response findEmployees(
@QueryParam("name") String name,
@QueryParam("page") String pageNumber,
@QueryParam("pageSize") String pageSize) {
...
List<Employee> employees = employeeService.findEmployees(...);
return Response.ok().entity(employees).build();
}
конечная точка приводит к HTTP 500 из-за следующего исключения:
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type class java.util.ArrayList, and MIME media type application/xml was not found
В первом случае JAX-RS, очевидно, устроил для правильного писателя сообщения, чтобы он ударил, возвращая коллекцию. Кажется несколько несогласованным, что это не происходит, когда коллекция помещается в тело сущности. Какой подход я могу предпринять, чтобы получить автоматическую сериализацию JAXB списка при возврате ответа?
Я знаю, что могу
- Просто верните список из метода ресурсов
- Создайте отдельный класс
EmployeeList
но задавался вопросом, есть ли хороший способ использовать объект Response
и получить список для сериализации без создания моего собственного класса-оболочки.