前言
这里感觉feign的体验不太好,被坑过几次。当然更大概率是我自己没仔细研究。看网上也很多人吐槽说feign不好用,坑多…
为避免后续爬坑,直接把这个绕开吧,就用 restTemplate了,后续顶多再配置一下负载均衡策略、使用@SentinelResource做服务熔断
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
这里处理返回值为泛型的问题 - 记录一下
怕后续遗忘了,再找起来麻烦
/**
*
* 向远程服务节点发送 GET 请求
* @param serviceId 服务节点ID,取 ServiceNameConstants 值
* @param methodPath 方法路径,如:"/ruInstance/startWithParam"
* @param responseType 接口返回类型 - new ParameterizedTypeReference<R<T>>(){}
* @return com.ruoyi.common.core.domain.R
* @date 2021/4/19 16:56
* @author wei.heng
*/
public <T> T getRemoteService(String serviceId, String methodPath, ParameterizedTypeReference<T> responseType){
HttpHeaders headers = SecurityUtils.getHttpHeaders();
String url = String.format("http://%s%s", serviceId, methodPath);
ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers), responseType);
return exchange.getBody();
}
使用:
/**
*
* 根据业务ID,查询学生报名的任务ID
* @param confId 活动报名主键ID/业务主键ID
* @return java.lang.String
* @date 2021/4/19 16:26
* @author wei.heng
*/
private String getTaskId(Long confId) {
String taskId = null;
ParameterizedTypeReference<R<List<FlowRuTaskVO>>> responseType = new ParameterizedTypeReference<R<List<FlowRuTaskVO>>>(){};
String getTaskUrl = String.format("/ruTask/targetTask/%s/%s/%d", ACTIVITY_APPLY_INSTANCE_KEY, ACTIVITY_APPLY_TASK_KEY, confId);
R<List<FlowRuTaskVO>> invokeRes = new RemoteInvokeUtil(restTemplate).getRemoteService(ServiceNameConstants.FLOW_SERVICE, getTaskUrl, responseType);
if(invokeRes.getCode() == HttpStatus.SUCCESS){
List<FlowRuTaskVO> data = invokeRes.getData();
if(CollectionUtils.isEmpty(data)){
log.error("未查询到报名相关任务, confId:{}", confId);
throw new CheckedException("未查询到报名相关任务,请联系管理员");
}
taskId = data.get(0).getTaskId();
}
return taskId;
}
上效果图:
字符串转Java泛型Bean
String 字符串转类似这样的JavaBean对像 使用 JSON.parseObject方法
JavaBean javaBean=JSON.parseObject(“String”,new TypeReference<JavaBean>(){});
若使用JavaBean javaBean=JSON.parseObject(“String”,JavaBean.class);
示例:
// 方法定义
public <R extends EcommercePubDTO, T> PageVO<T> postGetPage(R requestObj, TypeReference<PageVO<T>> responseType, String methodUrl) {
String responseBodyStr = post(requestObj, methodUrl);
return JSON.parseObject(responseBodyStr, responseType);
}
// 方法调用
ecommerceService.postGetPage(pageDto, new TypeReference<PageVO<OrderVO>>(){}, "/order/list");