REST client restTemplate ne peut pas obtenir la Collection d'objets
j'utilise le spring restTemplate. J'ai fait un service de repos et client comme test d'unité dans l'application séparée. J'ai la méthode que retour à la Liste des utilisateurs et de la méthode pour l'utilisateur de créer:
@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();
}
si je demande à me montrer tous les utilisateurs dans le navigateur, il s'affiche à moi xml. C'est OK. Mais, lorsque j'essaie d'utiliser ceci:
@Test
public void testGetAll() {
List list = new RestTemplate().getForObject(URL + "all", List.class);
System.out.println(list);
}
je suis
WARNING: GET request for "http://localhost:8080/REST/all" resulted in 500 (Internal Server Error); invoking error handler
j'ai essayé de débogage. Aucune exception pendant les travaux de méthode. Et le navigateur me montre le xml avec les utilisateurs. Quel est le problème?
en outre, je veux savoir, comment je peux obtenir le code d'état ou le message de l'objet template (pour le test)?
Merci pour vos réponses.
EDITED:
j'ai modifié ma méthode d'essai:
@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);
}
Et j'ai 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.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.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access0(ParentRunner.java:53)
at org.junit.runners.ParentRunner.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)
4 réponses
peut-être que de cette façon ....
RestTemplate template = new RestTemplate(true);
ResponseEntity<TblGps[]> responseEntity = restTemplate.getForEntity(urlGETList, TblGps[].class);
TblGps[]=responseEntity.getBody();
vous devez utiliser une implémentation concrète de List
, par exemple, vous pouvez utiliser ArrayList
, voir cet exemple:
ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);
il fonctionne même pour un tout générique de l'installation:
ResponseEntity<? extends ArrayList<HashMap<String,Object>>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<HashMap<String,Object>>>)ArrayList.class, parameterId);
quand vous mettez le Jaxb2RootElementHttpMessageConverter
vous outrepassez les convertisseurs par défaut fournis avec RestTemplate
. Un des convertisseurs par défaut (je pense que c'est le convertisseur de chaîne) peut gérer text/xml
type. Supprimer la totalité Jaxb2RootElementHttpMessageConverter
mais quitter la partie quand vous vous attendiez ArrayList.class
et non List.class
ceci:
@Test
public void testGetAll() {
RestTemplate template = new RestTemplate();
List list = template.getForObject(URL + "all",
ArrayList.class);
System.out.println(list);
}
Vous pouvez également avoir besoin d'ajouter un accept
en-tête pour choisir l'utilisation de text/xml
et pas l'un des autres types de produits:
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Arrays.asList(new MediaType[] {MediaType.TEXT_XML}));
Et utiliser exchange
RestTemplate
(au lieu de getForObject
):
List list = template.exchange(URL + "all", new HttpEntity<String>(requestHeaders()), ArrayList.class);
Vous pouvez utiliser restTemplate.getForEntity()
. Il sera de retour que vous ResponseEntity
avec toutes les informations de réponse(y compris l'état).