17

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 リソース オブジェクト (Jersey 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にリストをシリアル化する良い方法があるかどうか疑問に思っていました。

4

3 に答える 3

26

List<Employee>のインスタンスでラップしGenericEntityて、型情報を保持できます。

于 2012-08-02T10:05:27.917 に答える