【问题标题】:How to consume JSON response with spring restemplate properly?如何使用 spring resttemplate 正确使用 JSON 响应?
【发布时间】:2015-05-12 07:30:48
【问题描述】:

我有一个返回 JSON 值的 Spring MVC Rest 服务,我有 8 行,这是我的 JSON

[
{"no":"1","date":"2015-03-30","grandtotal":699618,"diskon":699618},
{"no":"2","date":"2015-03-30","grandtotal":1867949,"diskon":1867949},
{"no":"3","date":"2015-03-27","grandtotal":2190909,"diskon":2190909},
{"no":"4","date":"2015-03-26","grandtotal":8616120,"diskon":8616120},
{"no":"5","date":"2015-03-26","grandtotal":1095455,"diskon":1095455},
{"no":"6","date":"2015-03-24","grandtotal":938961,"diskon":938961},
{"no":"7","date":"2015-03-24","grandtotal":5603848,"diskon":5603848},
{"no":"8","date":"2015-03-20","grandtotal":3735899,"diskon":3735899}
]

我正在尝试什么.. 这是我的控制器。 SpringRestController.java 杰克逊之路:

@RequestMapping(value = "/view", method = RequestMethod.GET)
public String initCreationForm(Map<String, Object> model) {

    String url = "http://localhost:8080/SpringServiceJson/view/";

    RestTemplate restTemplate = new RestTemplate();
    TotalDiscList totaldisc = restTemplate.getForObject(url, TotalDisc.class);


    model.put("DiscValue",totaldisc);
    return "salesorders/totalDisc";
}

Gson方式:

public String initCreationForm(Map<String, Object> model) {

String url = "http://localhost:8080/SpringServiceJson/view/";

Gson gson = new Gson();

Collection<TotalDisc> totaldisc = gson.fromJson(url, PiutangListJson.class);



    model.put("DiscValue",totaldisc);
    return "salesorders/totalDisc";
}

我在这里错过了什么?它总是给我这个错误 “无法提取响应:没有找到适合响应类型 [class [Lorg.springframework.samples.my.model.TotalDiscList;] 和内容类型 [application/json] 的 HttpMessageConverter”

这是我的对象 TotalDiscList.java

public class TotalDiscList {

    private String no;
    @DateTimeFormat(pattern="dd-MM-yyyy")
    private Date date;
    private long grandtotal;
    private long diskon;

//getter setter skipped
}

我应该返回List&lt;TotalDiscList&gt; totaldisc = restTemplate.getForObject(url, List&lt;TotalDisc&gt;.class); 对吗? 我如何正确地做到这一点?

【问题讨论】:

  • 只返回一个列表。但是您返回的 JSON 与您拥有的类属性不匹配。在 JSON 中,您有 no 和您的对象 no_faktur。那些不匹配。你可以试试TotalDiscList[],而不是List
  • @M.Deinum 抱歉,我复制了错误的类属性。我刚刚更新了我的答案
  • @M.Deinum 所以这是我的代码,我用你的建议填充我的代码 TotalDiscList[] totaldisc = restTemplate.getForObject(url, TotalDiscList[].class);它仍然给我同样的错误

标签: json spring spring-mvc restful-url


【解决方案1】:

如果你有一个 servlet-context.xml,你可以在那里添加消息转换器,如下所示:

 <beans:bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <beans:property name="messageConverters" ref="jsonMessageConverter" />
    </beans:bean>

    <beans:bean id="jsonMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />

我也在做同样的事情。

【讨论】:

  • 别再说名字了,你有没有类似 application-context.xml 的东西...同样的代码。
  • 谢谢,成功了! dafuq 我已经坚持了一个星期了!非常感谢你hh
  • 但我选择 shadowray 作为我的答案,但我给你 50 分,因为我也做了他告诉我的事情。你的代码都帮助了我,非常感谢
  • 没问题。乐于助人。
【解决方案2】:

编辑

您需要为您的RestTemplate提供消息转换器

restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

然后尝试使用数组,如:

TotalDiscList[] totaldisc = restTemplate
                    .getForObject(url, TotalDiscList[].class);

【讨论】:

  • 我已经这样做了,它仍然给我同样的错误,我把我的代码放在我上面的评论中
  • 仍然失败..它给我错误 500“servlet [myproject] 在路径 [/myproject] 的上下文中的 Servlet.service() 引发异常 [处理程序处理失败;嵌套异常是 java.lang。 NoClassDefFoundError: org/codehaus/jackson/JsonProcessingException] 根本原因"
  • 该错误消息意味着它正在由 Jackson 处理(尽管 org.codehaus 是 Jackson 1.x 的包,而不是具有 com.fasterxml 的 2.x),您需要查看堆栈跟踪并尝试找出问题所在。可能是 JSON 格式错误,或者您的对象模型未正确映射到您收到的 JSON。
【解决方案3】:

你可以配置一个json消息转换器:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
       <list>
            <ref bean="jsonConverter" />
       </list>
    </property>
</bean> 

然后,您可以只注释您的方法:

   @RequestMapping(value = "/view", method = RequestMethod.POST)
   public TotalDiscList[] createDiscList(
         @RequestBody TotalDiscList[] object) {

   }

这将导致消息转换器尝试转换为给定的类。

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 2020-08-26
    • 2012-11-07
    • 2015-10-07
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多