【问题标题】:Consume a RESTful WS using Spring MVC and Jackson使用 Spring MVC 和 Jackson 使用 RESTful WS
【发布时间】:2014-02-25 09:14:53
【问题描述】:

我想使用 Spring 和 Jackson 使用 RESTful WS。 我正在考虑使用 Facebook Graph (FC Juventus's JSON data-stream) 获取的 JSON 流

这是我的控制器:

@Controller
public class ConsumeWSController {

    @RequestMapping(value = "/consumews", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Consume a RESTful webservice.", locale);
        RestTemplate restTemplate = new RestTemplate();
        Page page = restTemplate.getForObject("http://graph.facebook.com/juventus", Page.class);

        model.addAttribute("pageAbout", page.getAbout());
        model.addAttribute("pageAwards", page.getAwards());

        return "consumews";
    }

}

还有 Page 类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Page {

    private String about;
    private String awards;

    public String getAbout() {
        return about;
    }

    public void setAbout(String about) {
        this.about = about;
    }

    public String getAwards() {
        return awards;
    }

    public void setAwards(String awards) {
        this.awards = awards;
    }

 }

但是控制台返回这个错误:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [my.proj.Page] and content type [application/json;charset=UTF-8]
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

我该如何解决这个错误?

【问题讨论】:

    标签: json spring rest spring-mvc jackson


    【解决方案1】:

    确保您已将正确的 Jackson 包添加到您的类路径中。对于Jackson 2,您使用 Maven:

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.3.1</version>
    </dependency>
    

    或者如果你使用旧的Jackson 添加:

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.13</version>
    </dependency>
    

    【讨论】:

    • 我正在使用 com.fasterxml.jackson.core.jackson-databind 2.3.0。添加jackson-jaxrs-json-provider,eclipse返回Maven错误。
    【解决方案2】:

    您需要将 Jackson 定义为 JSON 内容的默认消息转换器。这就是我所做的(我使用 GSON,所以这可能不是 Jackson 消息转换器的确切语法):

     <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
            <property name="messageConverters">
                <list>
                    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
                </list>
            </property>
        </bean>
    

    但由于您没有将 RestTemplate 定义为 Spring 管理的 bean,因此您需要手动进行:

    restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
    

    PS。我看到您使用的是较新的 Jackson 依赖项,因此在这种情况下,正确的映射器可能会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多