如何使用Retrofit2和RxJava2抛出自定义异常

时间:2017-10-19 13:05:35

标签: java android exception retrofit2 rx-java2

使用Retrofit2和RxJava2时,我遇到了抛出自定义异常的问题。

改造Api定义

public interface BackendInterface {

    @Headers({"......"})
    @POST("international-services/")
    Observable<BackendResponse> post(@Body BackendRequest request, @Header("sessionId") String sessionId);
}

Retrofit Api的使用

@Override
public Observable<SomeBusinessObject> getSomething(@NonNull String sessionId, @NonNull SomeOtherBusinessObject something) {
    BackendRequest br = createBackendRequest(something);
    return backendInterface.post(br, sessionId).map(backendResponse -> {

        if (backendResponse.getResult().getCode() != 0) {
            return Observable.error(new ServiceException("my custom exception"));
        }

        SomeBusinessObject result = mapBusinessObject(br);
        return result;
    });
}

问题是以下一行

return Observerable.error(new ServiceException("my custom exception"));

Android Studio将其标记为错误并说“没有类型变量(y)T的实例存在,以便Observable符合SomeBusinessObject推理变量R具有不兼容的边界:相等约束:SomeBusinessObject下限:Observable

IDE的快速修复建议让我的方法“getSomething”返回Observable。

我不知道如何将自定义异常转发给我的observable的订阅者。

1 个答案:

答案 0 :(得分:1)

您的.map正在尝试同时返回SomeBusinessObjectObservable<"SomeType">。由于它们没有共同的父对象,因此无法解决Observable.error()应返回的内容。

使用.flatmap的解决方案,并将回复替换为return Observable.just(result);