使用Jersey RxJava客户端找不到类rx.Observable的序列化程序

时间:2017-01-14 09:47:33

标签: java jersey jackson rx-java jersey-client

我正在创建一个API资源,该资源使用Jersey RxJava客户端将其他资源聚合到一个响应中。但是,我收到了错误,这有点令人费解。返回的对象是JSONArray,但我得到了这个:

No serializer found for class rx.Observable and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: org.json.simple.JSONArray[0])

和方法:

@Override
public void getUsersDashboard(String token, String userId, @Suspended final AsyncResponse async) {
    List<JSONObject> list = //query persistence layer

    final Queue<String> errors = new ConcurrentLinkedQueue<>();

    final List<Observable> observables = list.stream()
            .map(jsonObject -> (String) jsonObject.get("href"))
            .map(link -> dashboard(token, link, errors))
            .collect(Collectors.toList());

    Observable.just(new JSONArray())
            .zipWith(observables, (jsonArray, resultFromObservable) -> {
                jsonArray.add(resultFromObservable);
                return jsonArray;
            })
            .subscribe(async::resume, async::resume);
}

任何想法会导致什么?

1 个答案:

答案 0 :(得分:1)

因此,您的observables列表的类型为List<Observable>。由此我假设dashboard方法返回Observable<?>;进一步假设它返回Observable<T extends JSONNode>,我会按如下方式重写你的方法:

@Override
public void getUsersDashboard(String token, String userId, @Suspended final AsyncResponse async) {
    List<JSONObject> list = //query persistence layer

    final Queue<String> errors = new ConcurrentLinkedQueue<>();

    Observable
    .fromIterable(list)
    .map(jsonObject -> (String) jsonObject.get("href"))
    .flatMap(link -> dashboard(token, link, errors))
    .collect(JSONArray::new, JSONArray::add)
    .subscribe(async::resume, async::resume);
}

如果使用以下行,zip方法也会有用:

.zipWith(Observable.merge(observables), (jsonArray, resultFromObservable) -> {

但是,zip()从每个observable中取出一个元素,这意味着你最终会得到一个大小为1的数组。