RESTE client restTemplate ne pouvez pas obtenir la Collection d'objets
- Je utiliser le Printemps restTemplate. J'ai fait une RESTE le client et les services comme test de l'unité dans des locaux séparés de l'application. 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 de me montrer tous les utilisateurs dans le navigateur, il affiche à moi xml. C'est OK. Mais, lorsque j'essaie d'utiliser cette:
@Test
public void testGetAll() {
List list = new RestTemplate().getForObject(URL + "all", List.class);
System.out.println(list);
}
J'ai eu
WARNING: GET request for "http://localhost:8080/REST/all" resulted in 500 (Internal Server Error); invoking error handler
J'ai essayé de débogage. Pas d'exception au cours de méthode fonctionne. Et le navigateur m'indique le xml avec les utilisateurs.
Quel est le problème?
Aussi, je veux savoir, comment je peux obtenir le code d'état ou d'un message à partir d'un modèle objet (pour le test)?
Merci pour vos réponses.
ÉDITÉ:
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$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)
- Peut-être vous avez besoin de spécifier le type de contenu que vous souhaitez recevoir en retour? Depuis la méthode produit 3 types de contenu différents, dont l'un sera utilisé pour procéder à votre demande?
- J'ai essayé de faire cela, mais je suis une exception. Je viens de mettre à jour ma question en expliquant que.
- Aura-t-il le même comportement si vous mettez
List
au lieuArrayList
, comme il était auparavant. Une autre chose - peut-être vous avez besoin d'un élément racine d'emballage de votre collection. Un peu de classe qui aura votre collection de champ et d'être correctement mappé à l'aide d'annotations JaxB. - Oui, le comportement de la même. Une autre est que, dans stacktrace pas [la classe java.util.ArrayList], mais juste une Liste
Vous devez vous connecter pour publier un commentaire.
peut-être de cette façon ....
Vous avez besoin d'utiliser une mise en œuvre concrète de
List
, par exemple, vous pouvez utiliserArrayList
, voir cet exemple:il fonctionne même pour un tout générique de l'installation:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to User
.Lorsque vous définissez la
Jaxb2RootElementHttpMessageConverter
vous remplacer la valeur par défaut des convertisseurs qui vient avecRestTemplate
. L'un des défaut de convertisseurs (je pense que c'est la chaîne de convertisseur) peut gérertext/xml
type. Retirez l'ensemble de laJaxb2RootElementHttpMessageConverter
mais quitter la partie quand vous prévuArrayList.class
et pasList.class
et cela fonctionne:Vous pourriez aussi avoir besoin d'ajouter un
accept
- tête pour choisir l'utilisation detext/xml
et pas l'un des autres types de produits:Et l'utilisation
exchange
avecRestTemplate
(au lieu degetForObject
):Vous pouvez utiliser
restTemplate.getForEntity()
. Il sera de retour, vousResponseEntity
avec toutes les informations de réponse(y compris l'état).