【问题标题】:How to return JSON from spring RESTful service and access it using RestTemplate class如何从 Spring RESTful 服务返回 JSON 并使用 RestTemplate 类访问它
【发布时间】:2014-05-13 07:15:50
【问题描述】:

我创建了一个 Spring RESTful Web 服务,用于提供 JSON 格式的热门歌曲列表,为此我在列表中添加了歌曲名称,并从我的 Spring RESTful Web 服务的@Restcontroller 返回了这个。所以@RestController 将自动处理这个 List 并把这个 JSON 格式转给我 ["song1","song2","song3"]。

现在任何人都可以告诉我如何返回带有更多属性的歌曲名称,例如 - (歌曲名称,电影,作词人,歌手,总点击数) 例如 - (“Lungi Dance”、“Chennai Express”、“Honey Singh”、“Honey Singh”、5000)。还告诉我如何访问我的 spring MVC 应用程序使用 RestTemplate 调用此 Web 服务。 请告诉我以下文件的变化。

在我的 Spring RESTful Web 服务的 @RestController 类中

@RequestMapping(value = "/topsongsWS", headers="Accept=application/json")
    Public List<?> getTopSongsWS() 
    {
            List<String> l1 = new ArrayList<String>();
            l1.add("mann mera (Table No 21)");
            l1.add("Lazy lad (Ghanchakkar)");
            l1.add("Oye boy Charlie (Matru Ki Bijli Ka Mandola)");
            l1.add("Blue Hai Pani Pani");
            l1.add("Latt lag gayi (Race 2)");
            return l1;
    }

在我的 config-servlet.xml 中

<context:component-scan base-package="com.songs.service.controller" />
<mvc:annotation-driven />

在我的 Spring MVC 应用程序的控制器中调用以上 RESTful Web 服务

@RequestMapping(value="/topsongs",method=RequestMethod.POST)
    public String getTopSongs(ModelMap md)
    { 
            //did stuff to configure headers & entity
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
            HttpEntity<String> entity = new HttpEntity<String>(headers);

            //this is the URL of my RESTfulservice returning JSON format    ["song1","song2","song3"]   
            String url="http://localhost:7001/SongAppWS/songappWS/topsongsWS";
            RestTemplate rt=new RestTemplate();
            ResponseEntity<?> listoftopmovies=rt.exchange(url,HttpMethod.GET,entity, List.class);
            md.addAttribute("listname", "Top 5 Songs of The Week:");
            String response=listoftopmovies.getBody().toString();
            List<String> listed = new ArrayList<String>(Arrays.asList(response.split(", ")));
            md.addAttribute("res",listed);
            return "Sucess";
    }

【问题讨论】:

  • 如果我正确理解您的问题,您需要getTopSongsWS 来返回List&lt;Song&gt;,而不是List&lt;?&gt;。这涉及实际创建此域对象以满足您的要求。目前尚不清楚为什么要从另一个控制器调用自己的 REST 端点,而不是直接使用其支持服务。无论哪种方式,这个问题都过于广泛,因为它涉及许多概念,而且您似乎缺少一些基础知识,我建议您查看Spring guides 以了解如何正确分层您的应用程序。

标签: spring rest


【解决方案1】:

要返回具有更多属性的歌曲,您应该创建一个资源表示类。在您的情况下,它可能看起来像

class Song {
private String name
private String film
//other fields and methods...

然后在你休息的时候

@RequestMapping(value = "/topsongsWS", headers="Accept=application/json")
public List<?> getTopSongsWS() 
{
        List<Song> l1 = new ArrayList<Song>();
        l1.add(new Song(atr1,atr2....));
        l1.add(new Song(atr1,atr2....));
        l1.add(new Song(atr1,atr2....)); 
        return l1;
}

在您的 spring mvc 应用程序中,您也应该有资源表示类,并且响应类型现在将是 Song 而不是 String 要使用您的 ws,这应该可以工作

@RequestMapping(value="/topsongs",method=RequestMethod.POST)
public String getTopSongs(ModelMap md)
{ 
String url="http://localhost:7001/SongAppWS/songappWS/topsongsWS";
RestTemplate rt=new RestTemplate();
Song[] songs = template.getForObject(url, Song[].class); 

md.addAttribute("listname", "Top 5 Songs of The Week:");
md.addAttribute("res", Arrays.asList(songs));  
return "Sucess";    

}

【讨论】:

  • 谢谢它解决了我的第一个问题,我的 RESTful WS 正在返回我要求的 JSON,但是对于我的第二个问题,当我访问这个 JSON 时,它显示 不合适找到 HttpMessageConverter
  • 也请回答这个问题 stackoverflow.com/questions/23644452/…
  • @user3626306 我刚刚编辑了我的帖子,以解决您关于如何使用 RestTemplate 使用 Web 服务的第二个问题
【解决方案2】:

你必须使用像 List 这样的模型类

请在 github 中查看以下源代码。它有 json 响应作为对象。希望它会有所帮助。 https://github.com/mohansaravanan/spring https://github.com/mohansaravanan/spring/tree/master/springmvc-3.2.2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2013-07-11
    • 2012-02-08
    • 2019-01-26
    • 1970-01-01
    • 2012-01-09
    • 2014-11-03
    相关资源
    最近更新 更多