为什么返回类型为Iterable <myclass>的jax-rs服务在Collection <myclass>不起作用时有效?</myclass> </myclass>

时间:2014-01-28 18:36:27

标签: java collections jersey jax-rs iterable

假设我有一个名为Person的名字和姓氏的简单类。还假设我有一个简单的休息服务,其中get端点返回一个人员列表。

public class Person {
    // name and last name properties plus getters and setters
}

// Service
@Stateless
@LocalBean
@Path("test")
public class SimpleRestService {
    //Suppose people is initialized and contains actual people
    private ArrayList<Person> people;

    @GET
    @PATH("/people/iterable")
    public Iterable<Person> getPeople(){
        //This one works
        return people;
    }

    @GET
    @PATH("/people/collection")
    public Collection<Person> getPeople(){
        //This one fails. HTTP 500. Nothing on server.log ...
        return people;
    }
}

fisrt endpoin test / people / iterable 可以正常工作,而 test / people / collection 将因HTTP 500而失败。有没有人知道这个?

1 个答案:

答案 0 :(得分:0)

Jersey有一个注册表,它将@Produces中的MIME类型与声明返回的方法的Java类型以及处理该对象以生成响应有效负载的处理程序相关联。它有一个处理程序,可将IterableList转换为JSON Array。它还有一个将Map转换为JSON Object的处理程序。 Java接口Collection的问题在于没有迹象表明它是应该表示为顺序集合(JSON Array)还是无序的命名项集合(JSON Object )。因此,默认情况下没有注册处理程序将Collection转换为application/json。这是应用程序服务器上记录的异常中的消息所指示的内容。