RestTemplate进行访问分页PageInfo

废话少说,给你们看代码: 

    //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,如有大佬,还望指点一下。

猜你喜欢

转载自www.cnblogs.com/wwct/p/12329179.html