【发布时间】:2016-05-26 08:07:32
【问题描述】:
我的回复有基类。当出现问题(例如身份验证问题)时会调用此类。
public class DefaultResponse
{
private transient Integer status;
private String property;
private String message;
private String developerMessage;
protected String code;
public void setResponse(final Response response)
{
if (this.status != null)
{
return;
}
if (response != null)
{
try
{
final Object obj = response.body();
if (obj != null && obj instanceof DefaultResponse)
{
this.status = response.code();
this.message = ((DefaultResponse) obj).message;
this.developerMessage = ((DefaultResponse) obj).developerMessage;
this.property = ((DefaultResponse) obj).property;
this.code = ((DefaultResponse) obj).code;
}
}
catch (final Exception ignored)
{
}
}
}
...
}
其余的 Responses 正在扩展这个类。
public class FeatureResponse extends DefaultResponse
{
// Implementation
}
这是我用来调用 API 以获取功能的方法。
public void getFeatures(final Location location)
{
Call<FeatureResponse> call = mService.getPassengerFeatures(location);
call.enqueue(new Callback<FeatureResponse>()
{
@Override
public void onResponse(Call<FeatureResponse> call, Response<FeatureResponse> response)
{
Logger.debug("Test", "Instance of response: " + response.getClass());
FeatureResponse featureResponse = new FeatureResponse();
if (response.isSuccessful())
{
//...
}
featureResponse.setResponse(response);
EventBus.post(featureResponse);
}
@Override
public void onFailure(Call<FeatureResponse> call, Throwable t)
{
Logger.error(TAG, "getPassengerFeatures.onFailure(), msg: " + t.getMessage());
FeatureResponse featureResponse = new FeatureResponse();
featureResponse.setFailure(t);
EventBus.post(featureResponse);
}
});
}
当我发送请求时,这是我的服务器响应:
{"status":403,"code":4030,"property":"","message":"Unauthorized access","developerMessage":"Unauthorized access"}
因此,onResponse 被调用,FeatureResponse 的新对象被创建,featureResponse.setResponse(response); 被调用。正如您在上面的代码中看到的,我正在尝试获取其 HTTP 状态代码。但是,问题是 if (obj != null && obj instanceof DefaultResponse) 始终是 false,因为 response 是类 retrofit2.Response 的实例。
是否可以将Response 转换为DefaultResponse?
【问题讨论】: