Aucun contenu à mapper en raison de l'analyseur jackson de fin d'entrée
Je reçois cette réponse du serveur {"status":"true","msg":"success"}
J'essaie d'analyser cette chaîne json à l'aide de la bibliothèque de l'analyseur Jackson, mais je suis confronté à une exception de mappage-exception.
com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: Java.io.StringReader@421ea4c0; line: 1, column: 1]
Pourquoi avons-nous ce genre d'exceptions?
Comment comprendre ce qui cause cette exception?
J'essaye d'analyser de la manière suivante:
StatusResponses loginValidator = null;
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);
try {
String res = result.getResponseAsString();//{"status":"true","msg":"success"}
loginValidator = objectMapper.readValue(result.getResponseAsString(), StatusResponses.class);
} catch (Exception e) {
e.printStackTrace();
}
classe StatusResponse
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({ "status","msg" })
public class StatusResponses {
@JsonProperty("status")
public String getStatus() {
return status;
}
@JsonProperty("status")
public void setStatus(String status) {
this.status = status;
}
@JsonProperty("msg")
public String getMessage() {
return message;
}
@JsonProperty("msg")
public void setMessage(String message) {
this.message = message;
}
@JsonProperty("status")
private String status;
@JsonProperty("msg")
private String message;
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonGetter
public Map<String, Object> getAdditionalProperties() {
return additionalProperties;
}
@JsonSetter
public void setAdditionalProperties(Map<String, Object> additionalProperties) {
this.additionalProperties = additionalProperties;
}
}
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.databind.ObjectMapper;
StatusResponses loginValidator = null;
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);
try {
String res = result.getResponseAsString();//{"status":"true","msg":"success"}
loginValidator = objectMapper.readValue(res, StatusResponses.class);//replaced result.getResponseAsString() with res
} catch (Exception e) {
e.printStackTrace();
}
Je ne sais pas comment cela a fonctionné et pourquoi cela a fonctionné? :( mais ça a marché
Je pourrais corriger cette erreur. Dans mon cas, le problème était côté client. Par erreur, je n'ai pas fermé le flux que j'écrivais sur le serveur. J'ai fermé le ruisseau et cela a bien fonctionné. Même l'erreur semble indiquer que le serveur n'a pas pu identifier la fin de la saisie.
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(jsonstring.getBytes());
out.close() ; //This is what I did
Dans mon cas, je lisais le flux dans un maillot RequestEventListener que j'avais créé côté serveur pour consigner le corps de la demande avant le traitement de la demande. J'ai alors réalisé que cela avait probablement pour résultat que la lecture suivante ne donnait aucune chaîne (ce qui est transmis lors de l'exécution de la logique métier). J'ai vérifié que c'était le cas.
Donc, si vous utilisez des flux pour lire la chaîne JSON, faites attention à cela.
J'ai eu une erreur similaire aujourd'hui et le problème était l'en-tête de type de contenu de la demande de publication. Assurez-vous que le type de contenu correspond à vos attentes. Dans mon cas, un en-tête de type de contenu "multipart/form-data" était envoyé à l'API au lieu de "application/json".