当前时间 2021/4/9 (写上时间是因为,springboot更新有点快,说不定过上两年下面的代码就不能用了)
原因
分布式,不同的服务连着不同的数据库,我们需要其他服务提供数据(也就是我们不能直接连到不同的数据库)。
解决方案
第一步
在main中添加。
@Bean
public RestTemplate initRestTemplate() {
return new RestTemplate();
}
不知道为什么springboot 删除了这个的初始化。
建议使用方式二
package com.jilinwula.feign.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/client")
public class Controller {
@Autowired
private RestTemplate template;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/get")
public Object get() {
ServiceInstance serviceInstance = loadBalancerClient.choose("jilinwula-springcloud-feign-server");
String url = String.format("http://%s:%s/server/get", serviceInstance.getHost(), serviceInstance.getPort());
String result = template.getForObject(url, String.class);
return result;
}
}
建议使用方式二是因为,我们可以根据注册的服务名得到使用的是http还是https。
springboot给我们隐藏了很多东西。隐藏的都不直观了。
类转换
通过网络返回的类。
不能直接进行类转换。 (这是需要注意的一点,猜测是java的机制决定的,这里的深层复制里面没有引用)
必须先转成json,再转成类。
//遍历list
for(Object object:courseInfoList){
// 将list中的数据转成json字符串
String jsonObject=JSON.toJSONString(object);
//将json转成需要的对象
CourseInfo courseInfo= JSONObject.parseObject(jsonObject,CourseInfo.class);
System.out.println(courseInfo);
}
总结,坑还是不少的。