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

如何用自定义的假客户机解码JSon响应?

彭涵衍
2023-03-14

在我的应用程序中,我必须知道,从一个列表中有一个服务器地址,这些地址是向上的。我发现的解决方案是从Spring引导执行器调用健康endpoint,对它们每个。JSon reponse是:

{
    "status": "UP"
}

在应用程序的其他部分,我使用Spring-Cloud中的Feign客户机,这些客户机使用@FeignClient注释定义,它工作得很好:

    @FeignClient(
            name = "tokenProxy",
            url = "${host}:${port}"
    )

不幸的是,这种配置不允许重用同一个客户机来调用不同地址上的同一个endpoint。因此,我必须定义自己的自定义客户端(如果有其他解决方案,请不要犹豫,告诉我!):

    @GetMapping(
      value = "/servers"
    )
    public Server discover() {
      MyClient myClient = Feign.builder()
        .target(
          Target.EmptyTarget.create(
            MyClient.class
          )
        );

      return myClient.internalPing(URI.create("http://localhost:8090"));
    }

    interface MyClient {
        @RequestLine("GET /actuator/health")
        Server internalPing(URI baseUrl);
    }

    class Server {
        private final String status;

        @JsonCreator
        public Server(@JsonProperty("status") String status) {
            this.status = status;
        }

        public String getStatus() {
            return status;
        }
    }

当我调用endpoint/servers时,会出现以下错误,这表明我的自定义Feign客户端没有与适当的解码器相混淆:

feign.codec.DecodeException: class com.xxx.web.Server is not a type supported by this decoder.
    at feign.codec.StringDecoder.decode(StringDecoder.java:34) ~[feign-core-10.10.1.jar:na]
    at feign.codec.Decoder$Default.decode(Decoder.java:92) ~[feign-core-10.10.1.jar:na]
    at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:115) ~[feign-core-10.10.1.jar:na]
    at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:87) ~[feign-core-10.10.1.jar:na]
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138) ~[feign-core-10.10.1.jar:na]

我想我应该使用JacksonDecoder,但在Spring-CloudHoxton.sr5:

      <dependencies>
    ...
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    ...
      </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
  </dependencyManagement>

有人能帮我吗,或者提供一个更好的解决方案来满足我的需求,或者解释一下如何正确配置自定义假客户机?

提前致谢

共有1个答案

景正文
2023-03-14

事实上,在使用spring-cloud依赖项时,默认情况下没有加载包含Jackson解码器和编码器的库。为了解决这个问题,我只需将以下内容添加到pom.xml文件中:

<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-jackson</artifactId>
</dependency>
 类似资料:
  • 我现在的问题是,我到底能实现什么/如何实现这些,或者是否有一种方法来扩展ErrorDecoder,使我能够处理这些错误消息。我想我应该能够将它们放入解码器,甚至实现/覆盖HttpClient,但我不确定正确/最好的方法是什么。

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

  • 也许有人能帮我找到解决办法。 我使用的是jersey apache客户端1.17 我尝试使用泽西客户端构建一个独立的应用程序(没有Servlet容器或其他什么,只是Java类),它与RESTFUL API通信,一切都很好,直到我尝试处理媒体类型“text/csv; charset=utf-8”,这是服务器发送的CSV流。 问题是,我可以用以下代码读取此流: 但是我想封装它并将其放入MessageB

  • 以下是我的Spring应用程序的相关部分: 上面的方法从未被调用。我需要成为一个Spring bean,因为我需要向它注入其他依赖项。 以下是文件的相关部分:

  • 我写了一个小的测试程序来创建 自定义自签名CA证书#1 创建由该CA根证书#1颁发的服务器证书#2 创建具有证书#2的服务器 创建一个RootCA指向证书1的客户端 客户端尝试连接到服务器,但出现错误: 得到“https://localhost:2000:x509:由未知颁发机构签署的证书(可能是因为尝试验证候选颁发机构证书“测试ca”时“x509:Ed25519验证失败”) 我知道这方面的例子有

  • 问题内容: 我正在使用Struts创建Web应用程序。当请求网址格式不正确时,我想发出如下错误的JSON响应 我已经在使用struts2-json插件来使用JSON序列化响应对象。我应该如何发送JSON错误响应。我可以想到下面的方法。 在操作类中使用错误响应对象,并显式设置所有名称必需的名称值对 然后,我可以只处理序列化在我的。 我是Struts的新手,想知道是否有确定的方法来做到这一点?也许可以