当前位置: 首页 > 知识库问答 >
问题:

带有自定义JSON响应的假错误解码器

何向荣
2023-03-14
Status: 200
Body: {
   "code":404,
   "message":"Data not found",
   "data":{},
   "status":"ERROR"
}
public class ApiFeignErrorDecoder implements ErrorDecoder {

    private final Gson gson;

    public ApiFeignErrorDecoder(Gson gson) {
        this.gson = gson;
    }

    @Override
    public Exception decode(String methodKey, Response response) {

        try {
            ApiResponse apiResponse = gson.fromJson(response.body().asReader(), BaseApiResponse.class);
            ResponseStatus status = apiResponse.getStatus();
            switch (status) {
                case SUCCESS:
                    return null;
                case FAIL:
                    return new Exception("Failure message recorded");
                case ERROR:
                    return new Exception("Error message recorded");
                default:
                    return new Exception("No suitable status found.");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return new ErrorDecoder.Default().decode(methodKey, response);
        }
    }

}

我现在的问题是,我到底能实现什么/如何实现这些,或者是否有一种方法来扩展ErrorDecoder,使我能够处理这些错误消息。我想我应该能够将它们放入解码器,甚至实现/覆盖HttpClient,但我不确定正确/最好的方法是什么。

共有1个答案

傅涵忍
2023-03-14

errordecoder一样,您可以使用SpringDecoder编写自定义逻辑来处理成功响应。

private class ResponseDecoder extends SpringDecoder {

    public ResponseDecoder(ObjectFactory<HttpMessageConverters> messageConverters) {
        super(messageConverters);
    }

    @Override
    public Object decode(Response response, Type type) throws IOException, FeignException {
        try {
            ApiResponse apiResponse = gson.fromJson(response.body().asReader(), BaseApiResponse.class);
            ResponseStatus status = apiResponse.getStatus();
            switch (status) {
                case SUCCESS:
                    return null;
                case FAIL:
                    throw new FeignException(FAIL, "Failure message recorded");
                case ERROR:
                    throw new FeignException(ERROR, "Error message recorded");
                default:
                    throw new FeignException(YOUR_DEFAULT_ERROR_CODE, "No suitable status found.");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return null; // return accordingly to your use-case
        }
    }

}

假装客户端接口:

@FeignClient(value = "foo", configuration = FooClientConfig.class)
public interface FooClient {
    //Your mappings
}

假装客户端自定义配置:

@Configuration
public class FooClientConfig {

    @Bean
    public Decoder feignDecoder() {
        // if you're using gson, add gson converter here instead
        HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());
        ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
        return new ResponseEntityDecoder(new ResponseDecoder(objectFactory));
    }

    public ObjectMapper customObjectMapper(){
        ObjectMapper objectMapper = new ObjectMapper();
        //Customize as much as you want
        return objectMapper;
    }
}
 类似资料:
  • 在我的应用程序中,我必须知道,从一个列表中有一个服务器地址,这些地址是向上的。我发现的解决方案是从Spring引导执行器调用健康endpoint,对它们每个。JSon reponse是: 在应用程序的其他部分,我使用Spring-Cloud中的Feign客户机,这些客户机使用注释定义,它工作得很好: 不幸的是,这种配置不允许重用同一个客户机来调用不同地址上的同一个endpoint。因此,我必须定义

  • 我将feign与OkHttpClient一起使用,并希望使用重试机制对返回状态代码200、ok和空正文的endpoint进行短轮询。用假动作可能吗?在状态代码2xx上没有调用自定义错误解码器。还有其他更喜欢的方式来进行短轮询吗?顺便说一句,我在用科特林。

  • Apache可以让网站管理员自己自定义对一些错误和问题的响应。 自定义的响应可以定义为当服务器检测到错误或问题时才被激活。 如果一个脚本崩溃并产生"500 Server Error"响应,那么这个响应可以被更友好的提示替换或者干脆用重定向语句跳到其他的URL(本地的或外部的)。 行为 老式的行为 Apache1.3 会响应一些对于用户没有任何意义的错误或问题信息,而且不会将产生这些错误的原因写入日

  • 给Rest服务打电话 http://acme.com/app/widget/123 返回: 此客户端代码的工作原理是: 但是,http://acme.com/app/widget/456返回: 但此客户端代码引发了一个异常: 我试过: 第二次调用只是抛出了另一个HttpClientErrorException,而且它觉得调用服务两次是不对的。 是否有一种方法可以调用该服务一次,并在成功时将响应解析

  • 我正在努力裁剪javax。验证。ConstraintValidator和javax。验证。根据我的需要限制ValidatorContext。我从格式错误的请求正文收到的响应消息始终采用以下形状: <代码> 此消息也以500而不是400错误请求的形式返回。我无法获得工作到解决方案来执行以下操作: 仅包括<代码> 我有以下代码: 向上面的代码发送格式错误的有效负载将导致如下消息: 我希望能够收到以下信