有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中操纵数据表单microservice响应,Spring Boot

我正在SpringBoot中的一个项目中工作,该项目具有微服务架构。我需要从一个微服务打电话到另一个微服务,并用我得到的数据作为响应来做一些事情。我对所有的微服务架构和Spring Boot都很陌生,所以我想我需要一个小小的推动:)

所以我有一节课:

HttpDataClient。java

public class HttpDataClient implements DataClient{

    private final static Logger LOGGER = LoggerFactory.getLogger(HttpDataClient.class);

    private final RestTemplate restTemplate;
    private final ObjectMapper objectMapper = new ObjectMapper();

    public HttpDataClient(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @Override
    public DataResponse getData(String dataId) {
        try{
            JsonNode node = restTemplate.exchange(
                    String.format("/data/%s", dataId),
                    HttpMethod.POST,
                    new HttpEntity<>(buildRequest(dataId), headers()),
                    JsonNode.class
            ).getBody();
            return dataResponse(node);
        }catch (HttpStatusCodeException e) {
            String msg = String.format(
                    "Error getting data for dataId: %s",
                    dataId,
                    e.getStatusCode(),
                    e.getResponseBodyAsString());
            LOGGER.error(msg);
            return dataResponse.failed();
        }
    }

    private MultiValueMap<String, String> headers() {
        final LinkedMultiValueMap<String, String> mv = new LinkedMultiValueMap<>();
        mv.set(HttpHeaders.CONTENT_TYPE, "application/json");
        return mv;
    }

    private DataResponse dataResponse(JsonNode node) {
        return DataResponse.dataResponse(
                asString(node, "dataId"),
                asString(node, "author"),
                asString(node, "authorDataId"),
                asString(node, "serverSideDataId")
        );
    }

    private JsonNode buildRequest(String dataId) {
        ObjectNode root = objectMapper.createObjectNode();
        root.put("dataId", dataId);
        return root;
    }
}

以及界面

public interface DataClient {

    DataResponse getData(String dataId);
}

从这个类中,当我得到响应时,我应该能够做下一步,如果author是“费城”,那么athorDataIdserverSideId是相同的,如果作者不是“费城”,那么athorDataIdserverSideId是不同的

现在,我创建了这个类:

public class DataResolver {

    private final HttpDataClient client;

    public DataResolver(HttpDataClient client) {
        this.client = client;
    }
}

在这个类中,我应该执行所有这些:

And from this class when I get response I should be able to do next if author is "Philadelphia" then athorDataId and serverSideId are the same and if author is not "Philadelphia" then athorDataId and serverSideId are not the same.

但我不知道如何开始。我知道我应该使用客户机来获取响应数据。我不知道如何使用它。。然后我可能会这样做:

if (author == Philadelphia) {
        authorDataId == serverSideDataId
    } elseif(author != Philadelphia) {
        authorDataId != serverSideDataId
    }

更新

有可能创建这样的新类吗

public class DataResolver {
        private final HttpDataClient client;
    
        public DataResolver(HttpDataClient client) {
            this.client = client;
        }
}

在这个类中,从响应中访问数据并以某种方式对其进行操作

大概是这样的:

public class DataResolver {
    private final HttpDataClient client;

    public DataResolver(HttpDataClient client) {
        this.client = client;
    }

    public DataIdResolver idResolver() {
        if (author == Philadelphia) {
            authorDataId == serverSideDataId
        } elseif(author != Philadelphia) {
            authorDataId != serverSideDataId
        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    如果您期望的响应应该包含上述属性,那么您应该创建以下类,并将其用作restTemplate.exchange中的返回类型,而不是JsonNode.class(假设类路径中有Jackson):

    public class DataClient {
       private String dataId;
       private String author;
       private String authorDataId;
       private String serverSideDataId;
    
       // getters and setters
    }
    

    所以在HttpDataClient类中会有这样的内容:

    @Override
    public DataClient getData(String dataId) {
        try{
            DataClient data = restTemplate.exchange(
                    String.format("/data/%s", dataId),
                    HttpMethod.POST,
                    new HttpEntity<>(buildRequest(dataId), headers()),
                    DataClient.class).getBody();
            return data;
        }catch (HttpStatusCodeException e) {
            String msg = String.format(
                    "Error getting data for dataId: %s",
                    dataId,
                    e.getStatusCode(),
                    e.getResponseBodyAsString());
            LOGGER.error(msg);
            return dataResponse.failed();
        }
    }
    

    DataResolver

    @Component
    public class DataResolver {
       private final HttpDataClient client;
    
       public DataResolver(HttpDataClient client) {
          this.client = client;
       }
    
       public DataClient idResolver(String dataId) {
           DataClient data = client.getData(dataId);
           // Whatever logic you need
           return data;
       }
    }
    

    这里可能有一件很重要的事情,那就是您很可能希望通过添加@Service注释,使HttpDataClient成为Springbean。通过这样做,您可以将其自动连接到您需要的任何其他Spring bean