废话少说,给你们看代码:
//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,如有大佬,还望指点一下。