com.fasterxml.jackson.databind.JsonMappingException (через цепочку ссылок: java.util.ArrayList[0])
Развертываем службу отдыха на wildfly. Вызов службы отдыха, как показано ниже, является успешным.
Entity<List<Product>> entity = Entity.entity(productList,MediaType.APPLICATION_JSON);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.method("POST", entity);
Определение сервиса отдыха
@Path("/streams/productList")
public class ProductListService extends ServiceBase {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response sendProducts(@Valid List<Product> pdts) throws IOException, URISyntaxException {
// more customization needed
return sendResponse(200, CommonUtils.getIds(pdts), new ArrayList<String>());
}
}
Новое требование состоит в том, чтобы отправить полезную нагрузку json в службу остальных, которая преобразуется в список продуктов. Ниже не работает! Это каждый продукт строки полезной нагрузки JSON, добавленной в список.
List<String> productsAsJsonPayload = retrievePayloadFromSomewhere();
Entity<List<String>> entity = Entity.entity(productsAsJsonPayload,MediaType.APPLICATION_JSON);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.method("POST", entity);
Это дает ошибку:
com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.abc.enterprise.devsvc.model.Product] from String value ('{"id":"00000001-0001-0001-0001-000000000001","type":"Some Product","serial":"MR-1234567","messageTimestamp":1484110968720,....}'); no single-String constructor/factory method
at [Source: io.undertow.servlet.spec.ServletInputStreamImpl@207f12a8; line: 1, column: 2] (through reference chain: java.util.ArrayList[0])
Мне пришлось внести эти изменения, чтобы заставить его работать: (по существу, добавить [])
StringBuilder jsonPayloadAsArray = new StringBuilder("[");
for (int idx = 0; idx < productsAsJsonPayload.size(); idx++) {
jsonPayloadAsArray.append(productsAsJsonPayload.get(idx));
if (idx < productsAsJsonPayload.size()-1) {
jsonPayloadAsArray.append(",");
}
}
jsonPayloadAsArray.append("]");
Entity<String> entity = Entity.entity(jsonPayloadAsArray.toString(),MediaType.APPLICATION_JSON);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.method(httpMethod, entity);
Но это взломать. Есть ли способ обойти это взломать?