改造 2:responseBodyConverter 转换为空对象

Posted

技术标签:

【中文标题】改造 2:responseBodyConverter 转换为空对象【英文标题】:Retrofit 2: responseBodyConverter converts to null object 【发布时间】:2016-07-20 21:47:03 【问题描述】:

我正在使用Retrofit 的最新版本(截至目前为 2.0.0-beta4)。从服务器收到 200 OK 代码时,一切正常。但我也想处理 not OK 响应,例如代码 401。因此,我必须获取错误响应代码以准确确定要执行的操作并显示适当的数据:

@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) 
    if (response != null && !response.isSuccess() && response.errorBody() != null) 
        Converter<ResponseBody, APIError> errorConverter = retrofit.responseBodyConverter(APIError.class, new Annotation[0]);
        try 
            APIError error = errorConverter.convert(response.errorBody());
            Toast.makeText(getContext(), "code = " + error.getCode() + ", status = " + error.getStatus(), Toast.LENGTH_SHORT).show();
         catch (IOException e) 
            e.printStackTrace();
        
     else if (null != response) 
        if (response.isSuccess()) 
            LoginResponse loginResponse = response.body();
            Toast.makeText(getContext(), "Successful login: " + loginResponse.getId(), Toast.LENGTH_SHORT).show();
        
    

APIError.java

public class APIError 
    String name;
    int status;
    String message;
    int statusCode;
    String code;
    String stack;

    public String getName() 
        return name;
    

    public int getStatus() 
        return status;
    

    public String getCode() 
        return code;
    

服务器的错误响应


  "error": 
    "name": "Error",
    "status": 401,
    "message": "login failed",
    "statusCode": 401,
    "code": "LOGIN_FAILED",
    "stack": "Error: login failed"
  

但是errorConverter.convert() 返回一个具有空值的对象。我看过similar posts,但没有帮助。

代码有什么问题?

【问题讨论】:

【参考方案1】:

在futurestud.io博客cmets找到答案:

APIError.java 更改为:

public class APIError 

    Error error;

    public Error getError() 
        return error;
    

    public static class Error 

        String name;
        int status;
        String message;
        int statusCode;
        String code;
        String stack;

        public String getName() 
            return name;
        

        public int getStatus() 
            return status;
        

        public String getCode() 
            return code;
        

    

【讨论】:

以上是关于改造 2:responseBodyConverter 转换为空对象的主要内容,如果未能解决你的问题,请参考以下文章

改造 2:从响应正文中获取 JSON

如何在改造 2 中按标签取消请求?

柱体改造 2 包括大括号

改造2:捕捉连接超时异常

改造 2:即使有也没有请求正文

改造 2 和 Spring RestController