如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON

Posted

技术标签:

【中文标题】如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON【英文标题】:How to access a huge JSON coming (from a spring RESTful Service) in a spring MVC app using RestTemplate 【发布时间】:2014-05-14 01:58:27 【问题描述】:

我的 Spring RESTful Web 服务正在返回一个 JSON 格式—— ["key1":"value1","key2":"value2","key3":"value3","key4":"value4","key5":"value5","key6" :"value6"] 现在,当我的 spring MVC 应用程序尝试访问它,以在 JSP 中显示然后出现异常说-找不到合适的 HttpMessageConverter请帮助我哪里出错了。这是我的代码-

在我的 Spring MVC 应用程序的 @Controller 类中调用 RESTful 服务

//**com.songs.controllers.FrontSongController.java**
</*
author Rohit Tiwari
*/>
@RequestMapping(value="/alls",method=RequestMethod.POST)
public String getAllSongs(ModelMap md)
 
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>(headers);
    String url="http://localhost:7001/SongAppWS/songappWS/allsongsWS";
    RestTemplate rt=new RestTemplate();

    //SongResource.class is for representation on incoming JSON see below for its code
    //This is the line no 48 that you will see in below browser logs

    ResponseEntity<SongResource> listofallsongs=rt.exchange(url,HttpMethod.GET,entity,  SongResource.class);
md.addAttribute("listname", "Songs available in the repository:");
System.out.println("Response Entity object= "+listofallsongs);
    System.out.println("Response Entity body= "+listofallsongs.getBody().toString());
return "Sucess";    

在调用 RESTful 服务的 Spring MVC 应用程序的 config-servlet.xml 中

<context:component-scan base-package="com.songs.controllers" />
<mvc:annotation-driven />
<context:annotation-config/> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>
<bean  class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
        </list>
    </property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

在我的 spring MVC 应用程序的 SongResource.java 内部,我试图用它来将即将到来的 JSON 转换为我的 SongResource.class 对象,我的 spring MVC 应用程序可以在 jsp 中使用

//**com.songs.service.resource.SongResource.java**

public class SongResource 

    private String name;
    private String film;
    private String singer;
    public SongResource(String name,String film,String singer)
    
    this.name=name;
    this.film=film;
    this.singer=singer; 
    
    //setter & getters of all above

在从我的 spring MVC 应用程序调用 spring REST 服务时,浏览器显示如下-

Error 500--Internal Server Error
org.springframework.web.client.RestClientException: Could not extract response: no suitable     HttpMessageConverter found for response type [com.songs.service.resource.SongResource] and content type  [application/json]
at   org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java  :77)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:619)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:1)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:446)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:377)
at com.songs.controllers.FrontSongController.getAllSongs(FrontSongController.java:48)

//等等

【问题讨论】:

【参考方案1】:

试试这个,希望对你有帮助

@RequestMapping(value="/alls",method=RequestMethod.POST)
public String getAllSongs(ModelMap md)
  
String url="http://localhost:7001/SongAppWS/songappWS/allsongsWS";
RestTemplate rt=new RestTemplate();
SongResource[] songRs = template.getForObject(url, SongResource[].class);

List<SongResource> songs = Arrays.asList(songRs);

md.addAttribute("listname", "Songs available in the repository:");
md.addAttribute("listValues", songs);  
return "Sucess";    

【讨论】:

以上是关于如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用resttemplate访问时,如何使端点仅接受springboot中启用@crossorigin的uri?为啥我没有收到 cors 错误? [复制]

如何在RestTemplate 结合 Ribbon 使用?

required a bean of type ‘org.springframework.web.client.RestTemplate‘ that could not be found.

如何使用 spring 记录 RestTemplate 请求和响应?

如何使用 RestTemplate 在 List 中获取结果并将响应放入 List?

如何使用 OAuth2RestTemplate + Spring 4?