Я получаю это исключение, когда пытаюсь сопоставить ответ с сущностью, используя метод Response.readEntity()
из пакета javax.ws.rs.core;в тесте Джерси.Я не уверен, что я делаю не так?Ошибка, вероятно, очевидна, но я довольно плохо знаком с JAX-RS и Джексоном.
Исключение :
javax.ws.rs.ProcessingException: Error reading entity from input stream.
org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:112)
at example.src.ExampleTest.putExample(ExampleTest.java:261)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot construct instance of javax.ws.rs.core.Link (although at least one Creator exists):
cannot deserialize from Object value (no delegate- or property-based Creator)at
[Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 242]
(through reference chain: example.src.ExampleResponse["links"]->java.util.ArrayList[0])
У меня есть класс ответа :
@JsonPropertyOrder({"name"});
public class ExampleResponse() {
private String name;
private List<Link> links = new ArrayList<>();
public List<Link> getLinks() {
return links;
}
public void addLink(String url, String rel) {
links.add(Link.fromUri(url)
.rel(rel)
.build());
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public static ExampleResponse instance(String url) {
ExampleResponse er = new ExampleResponse();
er.setName("someName");
er.addLink(url, "relation");
return er;
}
}
Тогда у меня есть resource :
@Path("/1/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ExampleResouce() {
private String uri = someInitMethod();
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response putExample() {
return Response.status(Status.OK)
.type(MediaType.APPLICATION_JSON_TYPE)
.entity(ExampleResponse.instance(uri))
.build();
}
}
И, наконец, тест, завершившийся неудачей в readEntity :
@Test
public void testPut() {
ExampleResponse toPut = new ExampleResponse();
toPut.setName("New_Name");
final Response response = target("/1/").request()
.put(Entity.json(toPut));
assertEquals(Status.OK.getStatusCode(), response.getStatus());
ExampleResponse er = response.readEntity(ExampleResponse.class);
}