Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

REST client restTemplate can't get Collection of objects

I use Spring restTemplate. I made a REST service and client as unit test in separated application. I have method that return List of users and method for user creating:

@GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON,         MediaType.TEXT_XML }) @Path("/all") public Response getAllUsers() {     List<User> list = dao.getAll();     GenericEntity<List<User>> result = new GenericEntity<List<User>>(list) {     };     return Response.status(Status.OK).entity(result).build(); } 

If I request to show me all users in browser, it displays to me xml. It's OK. But, when I try to use this:

@Test public void testGetAll() {     List list = new RestTemplate().getForObject(URL + "all", List.class);     System.out.println(list); } 

I got

WARNING: GET request for "http://localhost:8080/REST/all" resulted in 500 (Internal Server Error); invoking error handler 

I tried to debug this. No exceptions during method works. And browser shows me the xml with users. What can be wrong?

Also, I want to know, how I can get status code or message from template object (for test)?

Thanks for your answers.

EDITED:

I modified my test method:

@Test public void testGetAll() {     RestTemplate template = new RestTemplate();      List<HttpMessageConverter<?>> messageConverters = new    ArrayList<HttpMessageConverter<?>>();     Jaxb2RootElementHttpMessageConverter jaxbMessageConverter = new Jaxb2RootElementHttpMessageConverter();     List<MediaType> mediaTypes = new ArrayList<MediaType>();     mediaTypes.add(MediaType.APPLICATION_XML);     jaxbMessageConverter.setSupportedMediaTypes(mediaTypes);     messageConverters.add(jaxbMessageConverter);      template.setMessageConverters(messageConverters);     List list = template.getForObject(URL + "all",             ArrayList.class);     System.out.println(list); } 

And I got exception:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class java.util.ArrayList] and content type [application/xml] at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:107) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:496) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:452) at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:222) at com.nixsolutions.web.service.rest.UserRESTServiceTest.testGetAll(UserRESTServiceTest.java:61) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
like image 912
Oleksandr H Avatar asked Oct 18 '13 12:10

Oleksandr H


People also ask

What is difference between getForObject and getForEntity?

For example, the method getForObject() will perform a GET and return an object. getForEntity() : executes a GET request and returns an object of ResponseEntity class that contains both the status code and the resource as an object. getForObject() : similar to getForEntity() , but returns the resource directly.

Why RestTemplate is deprecated?

RestTemplate provides a synchronous way of consuming Rest services, which means it will block the thread until it receives a response. RestTemplate is deprecated since Spring 5 which means it's not really that future proof.

What is RestTemplate getForObject?

The getForObject method fetches the data for the given response type from the given URI or URL template using HTTP GET method. To fetch data for the given key properties from URL template we can pass Object Varargs and Map to getForObject method. The getForObject returns directly the object of given response type.


1 Answers

maybe this way ....

RestTemplate template = new RestTemplate(true);   ResponseEntity<TblGps[]> responseEntity = restTemplate.getForEntity(urlGETList, TblGps[].class);  TblGps[]=responseEntity.getBody(); 
like image 168
kamokaze Avatar answered Sep 21 '22 00:09

kamokaze