Ke Vin
Ke Vin

Reputation: 3750

How to consume JSON response with spring restemplate properly?

I have a Spring MVC Rest service that return JSON value, i have 8 row, here is my 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}
]

What i trying.. Here is my controller. SpringRestController.java Jackson Way :

@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 way :

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";
}

what i missed here? it always give me this error "Could not extract response: no suitable HttpMessageConverter found for response type [class [Lorg.springframework.samples.my.model.TotalDiscList;] and content type [application/json]"

Here is my object 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
}

i should return List<TotalDiscList> totaldisc = restTemplate.getForObject(url, List<TotalDisc>.class); right? how i do that properly?

Upvotes: 1

Views: 3081

Answers (3)

rmalchow
rmalchow

Reputation: 2769

you can configure a json message converter:

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

and then, you can just annotate your method:

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

   }

which would cause the message converter to try to convert to the given class.

Upvotes: 0

We are Borg
We are Borg

Reputation: 5313

If you have a servlet-context.xml, you can add the message-convertor there, like below :

 <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" />

I am doing the same and it works.

Upvotes: 1

Rafik BELDI
Rafik BELDI

Reputation: 4158

Edit

You need to provide a Message converter to your RestTemplate

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

And then try using an array, such as:

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

Upvotes: 0

Related Questions