【问题标题】:Why a jax-rs service with return type Iterable<MyClass> works while Collection<MyClass> doesn't?为什么返回类型为 Iterable<MyClass> 的 jax-rs 服务有效而 Collection<MyClass> 无效?
【发布时间】:2014-02-20 05:57:34
【问题描述】:

假设我有一个简单的 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;
    }
}

第一个端点 test/people/iterable 可以正常工作,而 test/people/collection 会因 HTTP 500 而失败。有人对此有所了解吗?

【问题讨论】:

    标签: java collections jersey jax-rs iterable


    【解决方案1】:

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

    【讨论】:

    • 对此我不太确定。它必须与泛型和TypeEreasure 做更多的事情。我做了测试,创建了一个 Person 类和上面的服务,但我能够无差别地返回 Iterable 或 Collection 。然后我添加了一些泛型,它停止了对 Iterable 和 Collection 的工作。当我能够返回 Iterable 而不是 Collection 时,我试图重现完全相同的场景,但不幸的是我做不到。那么......我不知道这是否仍然是一个有效的问题,因为我无法复制它
    猜你喜欢
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多