Deserializing REST xml into JAXB annotated class



I am querying a restful service (3rd party, no access to source etc) and I want to deserialize the response to relevant classes. I have following method to do it:



protected String getRestResponse(String path, List<String[]> params) {
// ResteasyProviderFactory instance = ResteasyProviderFactory.getInstance();
// RegisterBuiltin.register(instance);
// instance.registerProvider(ResteasyJackson2Provider.class);

ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(UriBuilder.fromUri(PropertiesHandler.getPropertyByKey("restUrl")).build());
client.register(new AddAuthHeadersRequestFilter(restClient.getUser(), restClient.getPass()));
client.register(ResteasyJackson2Provider.class);
target = target.path(path);
if (params != null) {
for (String[] s : params) {
target = target.queryParam(s[0], s[1]);
}
}

Response response = target.request(MediaType.APPLICATION_XML).get();

// THIS DOES NOT WORK
List<UserDTO> list = response.readEntity(new GenericType<List<UserDTO>>() {});
// return response.readEntity(String.class);
return null; // :/
}


I have written classes that represent the data structure got back form service. The data:



<?xml version="1.0" encoding="UTF-8"?>

<list>
<local.User>
<id>132d5719-b1fe-4677-861d-fd08fbcb7bcf</id>
<name>Peter</name>
<age>81</age>
</local.User>
<local.User>
<id>e5ad3ad6-b291-47f5-8b52-025f6f7e1c27</id>
<name>Susan</name>
<age>11</age>
</local.User>
</list>


And the class:



@XmlRootElement(name = "local.User")
public class UserDTO {
@XmlElement
private String id;
@XmlElement
private String name;
@XmlElement
private String age;

// .. skipped
}


Anyway, when I run this, I get:



javax.ws.rs.ProcessingException: Unable to find a MessageBodyReader of content-type application/xml and type class UserDTO
at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:166)
at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readEntity(ClientResponse.java:135)
at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:199)


I have also tried to response.readEntity with datastructure representing the list, but also no luck, same message (with relevant data types).



@XmlRootElement(name = "list")
@XmlSeeAlso({GridNodeDTO.class})
public class ListUser {
List<UserDTO> dtoList;
}


Everything works when I read the response to String.class. How can I deserialize the response into my own classes?


No comments:

Post a Comment