Короче говоря, я пытаюсь написать интеграционный тест с гарантированным отдыхом для службы отдыха, которую я написал. Моя проблема в том, что когда сервер пытается десериализовать JSON, я получаю ошибку с полем «метаданные», не отмеченным как невежественное. Я должен обработать это поле, что также означает (насколько мне известно), я не могу отметить его как невежественное. Да, я «выключил и снова включил». Выключил apache, вручную удалил мою войну и взорвал файлы, перераспределил, осмотрел содержимое, чтобы увидеть обновления, снова включил сервер.JsonProperty будет сериализовать, но не deserialize
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Если я не могу обновлять версии, но я мог бы понизить их. Например, я могу использовать Jackson 1.0 вместо Jackson 2.0. Я также упростил свою проблему ради краткости. Я никак не могу изменить структуру JSON. Я видел аналогичную тему, связанную с Spring, но я не использую Spring.
Это всего лишь фрагмент всего объекта JSON. Если я могу получить метаданные и два его атрибута, я могу применить то, что я узнал, к остальной части проблемы. Благодаря!
Мой JSON
{
"meta-data" : {
"submission-time" : "06.12.2016",
"workflow-reference" : "TEST-WORKFLOW"
}
}
Мои JSON POJO
package com.company.group.project.module.shared.json;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Feature;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true)
public class JsonMandateRequest {
@JsonProperty("meta-data")
private MetaData metadata;
public MetaData getMetadata() {
if (null == metadata) {
metadata = new MetaData();
}
return metadata;
}
public void setMetadata(final MetaData metadata) {
this.metadata = metadata;
}
@JsonSerialize
public static class MetaData {
@JsonProperty("submission-time")
private String timestamp;
@JsonProperty("workflow-reference")
private String workflow;
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(final String timestamp) {
this.timestamp = timestamp;
}
public String getWorkflow() {
return workflow;
}
public void setWorkflow(final String workflow) {
this.workflow = workflow;
}
}
}
My Rest Service объявление (я знаю путь работает. Это не то, что сломана.)
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public Response uploadFile(final JsonMandateRequest reminders) {
return buildResponse(reminders, PROCESSOR_UPLOAD_MANDATE);
}
Здесь это код, который создает мою строку JSON. Он работает, но я включаю его в случае, если это приносит пользу читателю.
кодpublic static String writeObject(final Object obj) throws IOException
{
ObjectMapper mapper = new ObjectMapper();
mapper = mapper.disable(
DeserializationFeature.FAIL_ON_INVALID_SUBTYPE);
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
}
Моя интеграция Тест фрагмент
Response r = given()
.contentType(ContentType.JSON)
.body(jsonString)
.when().post(url);
System.out.println("Response from " + url + "(" + r.getStatusCode() + ")");
System.out.println(r.asString());
Выход:
Response from http://localhost:8080/application/rest/path(400)
Unrecognized field "meta-data" (Class com.company.group.project.module.shared.json.JsonMandateRequest), not marked as ignorable
at [Source: [email protected]; line: 2, column: 18] (through reference chain: com.company.group.project.module.shared.json.JsonMandateRequest["meta-data"])
Completed com.company.group.project.module.services.rest.InstructionServiceIT#testLifecycle(InstructionServiceIT.java:95)
Мой сервлет контейнер кот 7.0.73 Вот отрывки из моей pom.xml, которые показывают другие версии программного обеспечения, которое я использую.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.3</version>
</dependency>
Это может быть так же просто, как удалить поставщика jersey-json. Джексон-jaxrs-json-провайдер зарегистрирует поставщика Джексона. Это может быть проблема несоответствия версии трикотажа. –
Возможно, вам придется зарегистрировать файл com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider вручную после удаления jersy-json зависимости. –
@ChrisHinshaw Спасибо! Это была проблема несоответствия версии. –