2016-12-21 1 views
1

En bref, j'essaie d'écrire un test d'intégration avec repos pour un service de repos que j'ai écrit. Mon problème est que lorsque le serveur tente de désérialiser le JSON, j'obtiens l'erreur avec le champ "méta-données" non marqué comme ignorable. Je dois traiter ce domaine, ce qui signifie aussi (au meilleur de ma connaissance) que je ne peux pas le marquer comme étant ignorable. Oui, je l'ai "éteint et rallumé". Éteint apache, manuellement supprimé ma guerre et a explosé des fichiers, redéployé, examiné le contenu pour voir les mises à jour, a rallumé le serveur. DISCLAIMERS: Si je ne peux pas mettre à jour les versions, mais je pourrais éventuellement rétrograder. Par exemple, je pourrais utiliser Jackson 1.0 au lieu de Jackson 2.0. J'ai également simplifié mon problème par souci de brièveté. Je ne peux pas modifier la structure JSON en aucune façon. J'ai vu un sujet similaire lié à Spring, mais je n'utilise pas Spring.JsonProperty sérialisera mais ne désérialisera pas

Ceci est juste un fragment de l'objet JSON entier. Si je peux obtenir des méta-données et que ses deux attributs fonctionnent, je peux appliquer ce que j'ai appris au reste du problème. Merci!

Mon JSON

{ 
    "meta-data" : { 
    "submission-time" : "06.12.2016", 
    "workflow-reference" : "TEST-WORKFLOW" 
    } 
} 

Mon 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; 
     } 

    } 
} 

Mon repos déclaration de service (Je sais que le chemin fonctionne. Ce n'est pas ce qui est brisé.)

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN}) 
public Response uploadFile(final JsonMandateRequest reminders) { 
    return buildResponse(reminders, PROCESSOR_UPLOAD_MANDATE); 
} 

ici est le code qui produit ma chaîne JSON. Cela fonctionne, mais je l'inclue dans le cas où cela profite au lecteur d'une certaine façon.

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); 
} 

Mon intégration Code d'essai extrait de code

Response r = given() 
      .contentType(ContentType.JSON) 
      .body(jsonString) 
      .when().post(url); 
    System.out.println("Response from " + url + "(" + r.getStatusCode() + ")"); 
    System.out.println(r.asString()); 

Sortie:

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) 

Mon conteneur de servlet est tomcat 7.0.73 Voici les extraits de mon pom.xml qui montrent les autres versions du logiciel que j'utilise.

<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

Cela peut être aussi simple que de supprimer le fournisseur jersey-json. Le fournisseur jackson-jaxrs-json enregistrera le fournisseur jackson. Cela peut être un problème de non-concordance de la version jersey. –

+0

Vous devrez peut-être enregistrer manuellement le fichier com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider après avoir supprimé la dépendance jersy-json. –

+0

@ChrisHinshaw Merci! C'était un problème de discordance de version. –

Répondre

1

Merci à Chris Hinshaw de m'avoir indiqué la bonne direction. La version du maillot que j'utilise ne supporte pas la version de Jackson que j'utilise. Je ne peux pas passer à une version plus récente de Jersey, donc j'ai dû quitter Jackson 2 pour Jackson 1. J'ai laissé les anciennes choses commenter pour le bénéfice du lecteur.

<!--<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> 

Apparemment, Jersey 1.9.1 est compatible avec Jackson 1.9.0, au moins dans mon cas. Mes nouvelles importations dans JsonMandateRequest ressemblent à ceci:

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; 

Espérons que cela aide quelqu'un!