废话少说,给你们看代码:
//provide的controller
@ResponseBody
@RequestMapping(value = "details",method = RequestMethod.GET)
public PageInfo<Detail> queryByTitle(@RequestParam(required = false) String title, @RequestParam(required = false) Integer pageNum,@RequestParam(required = false) Integer pageSize){
System.out.println("title:"+title+",pageNum:"+pageNum+",pageSize:"+pageSize);
if (pageNum == null) {
pageNum=1;
}
if (pageSize == null) {
pageSize=2;
}
PageInfo<Detail> pageInfo = detailService.queryByTitle(title, pageNum, pageSize);
return pageInfo;
}
记得加@ResponseBody注解,不然会consumer的请求会报org.springframework.web.client.HttpClientErrorException$NotFound: 404 null。
//负责调用provider的方法,获取数据
@Autowired
private RestTemplate restTemplate;
//在provider端资源的路径
private String url="http://localhost:8080/details";
//导游provider的方法查询所有用户
public PageInfo<Detail> queryByTitle(String title,Integer pageNum,Integer pageSize){
Map<String, Object> params = new HashMap<>();
params.put("pageSize", pageSize);
params.put("pageNum", pageNum);
params.put("title", title);
//使用占位符,map中不能没有占位符的键值对
PageInfo pageInfo = restTemplate.getForObject(url + "?pageSize={pageSize}&pageNum={pageNum}&title={title}", PageInfo.class, params);
//集合转json再转回来
String json = JSON.toJSONString(pageInfo.getList());
List<Detail> details = JSON.parseArray(json, Detail.class);
pageInfo.setList(details);
return pageInfo;
}
集合转json再转回来,这一步是个大坑啊,说起来都是泪,直接返回pageInfo,前台Thymeleaf页面也可以遍历出集合并拿到值进行展示,但怪就怪在,我Timestamp的日期不能进行格式化(<td th:text="${#dates.format(detail.createdate, ‘yyyy-MM-dd HH:mm‘)}"></td>),我不进行格式化日期,页面可以输出,说明我的日期不是空的。但是日期不格式化也不行,报错EL1029E: A problem occurred when trying to execute method ‘format‘ on object和Failed to convert from type [java.lang.String] to type [java.util.Date]什么的。百度中。。。 考虑是不是格式化方法不行 ,试了各种格式化方式发现还是不行,说我日期是String类型的,我寻思着搁后台遍历打印一下看看日期是不是Timestamp类型的,不遍历没啥,一遍历报错!java.util.LinkedHashMap cannot be cast to com.zhou.entity.Detail,说不能转换成我的Detail实体类 ??? ,百度。。。 (https://blog.csdn.net/shijiujiu33/article/details/93410585)返回的时候会把PageInfo转变成json的形式(内部是jackjson技术支持的)
所以遍历集合就会报上面的异常(具体情况也不太清楚)。根据这篇博客,试了一下,发现可以遍历了,而且页面也可以格式化日期了。深坑!!!。
如果是返回对象集合的话建议这样做:
@Autowired
private RestTemplate restTemplate;
//在provider端资源的路径
private String url="http://localhost:8080/comments";
//根据新闻编号查询所有评论
public List<Comment> queryByNewsId(Integer id){
Comment[] comment = restTemplate.getForObject(url + "/" + id, Comment[].class);
return Arrays.asList(comment);
}
返回对象数组,再将其转为对象集合。就不会出现上面的情况,但我是直接返回PageInfo,第一次用RestTemplate,如有大佬,还望指点一下。
原文:https://www.cnblogs.com/wwct/p/12329179.html