2016-12-21 11 views
1

Короче говоря, я пытаюсь написать интеграционный тест с гарантированным отдыхом для службы отдыха, которую я написал. Моя проблема в том, что когда сервер пытается десериализовать 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> 
+0

Это может быть так же просто, как удалить поставщика jersey-json. Джексон-jaxrs-json-провайдер зарегистрирует поставщика Джексона. Это может быть проблема несоответствия версии трикотажа. –

+0

Возможно, вам придется зарегистрировать файл com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider вручную после удаления jersy-json зависимости. –

+0

@ChrisHinshaw Спасибо! Это была проблема несоответствия версии. –

ответ

1

Спасибо Крису Хиншоу за то, что указали мне в правильном направлении. Версия джерси, которую я использую, не поддерживает версию Джексона, которую я использую. Я не могу подойти к более новой версии Джерси, поэтому мне пришлось уйти от Jackson 2 к Jackson 1. Я оставил старые вещи, прокомментированные в пользу читателя.

<!--<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.4</version> 
    </dependency>--> 
    <dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-all</artifactId> 
    <version>1.9.0</version> 
    </dependency> 

По-видимому, Jersey 1.9.1 совместим с Jackson 1.9.0, по крайней мере, в моем случае.

Мои новые импортные товары в JsonMandateRequest выглядят следующим образом.

import org.codehaus.jackson.annotate.JsonIgnoreProperties; 
import org.codehaus.jackson.annotate.JsonProperty; 
import org.codehaus.jackson.map.annotate.JsonDeserialize; 
import org.codehaus.jackson.map.annotate.JsonSerialize; 

Надеюсь, это поможет кому-то!

 Смежные вопросы

  • Нет связанных вопросов^_^