如何在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
是“费城”,那么athorDataId
和serverSideId
是相同的,如果作者不是“费城”,那么athorDataId
和serverSideId
是不同的
现在,我创建了这个类:
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" thenathorDataId
andserverSideId
are the same and if author is not "Philadelphia" thenathorDataId
andserverSideId
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 楼答案
如果您期望的响应应该包含上述属性,那么您应该创建以下类,并将其用作
restTemplate.exchange
中的返回类型,而不是JsonNode.class
(假设类路径中有Jackson):所以在
HttpDataClient
类中会有这样的内容:和
DataResolver
这里可能有一件很重要的事情,那就是您很可能希望通过添加
@Service
注释,使HttpDataClient
成为Springbean。通过这样做,您可以将其自动连接到您需要的任何其他Spring bean