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>
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. –
Vous devrez peut-être enregistrer manuellement le fichier com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider après avoir supprimé la dépendance jersy-json. –
@ChrisHinshaw Merci! C'était un problème de discordance de version. –