Bonjour, j'envoie une demande de publication JSON à l'aide de FireFox RestClient.
Ma demande JSON est la suivante:
{ "firstName": "Test", "lastName": "1", "isActive": 1 }
Mon POJO a un champ actif comme ci-dessous
private boolean isActive;
Mon contrôleur est défini comme ci-dessous
@RequestMapping(method = {RequestMethod.POST,
RequestMethod.PUT}, value = "/save")
public ResponseEntity<RestResponse> save(
@RequestBody POJOUserDetails userDetails, WebRequest request){
Dans mon POJO, lorsque je vérifie la valeur de isActive, c'est faux, peu importe ce que j'envoie. J'ai essayé la valeur ci-dessous dans ma demande JSON
"isActive": 1
"isActive": true
"isActive": "true"
"isActive": ""
"isActive": null
"isActive": false
Tout ce qui précède envoie un faux dans mon contrôleur. Veuillez aider. Merci
Ajout de détails POJO
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include=Inclusion.NON_EMPTY)
public class POJOUserDetails {
private String firstName;
private String lastName;
private boolean isActive;
public boolean isActive() {
return isActive;
}
public void setActive(boolean isActive) {
this.isActive = isActive;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
N'oubliez pas que Jackson, par défaut, détermine le nom de la propriété à partir du getter ou du setter (le premier qui correspond).
Pour désérialiser un objet de type POJOUserDetails
, Jackson recherchera trois propriétés
public void setFirstName(String firstName) {
public void setLastName(String lastName) {
public void setActive(boolean isActive) {
dans le JSON. Ce sont essentiellement firstName
, lastName
, active
.
Vous obtenez le JSON suivant
{ "firstName": "Test", "lastName": "1", "isActive": 1 }
Donc firstName
et lastName
sont mappés, mais vous n'avez pas de propriété nommée isActive
.
Jackson dépend de Java Conventions de nommage du bean avec leurs accesseurs (getters) et mutateurs (setters). Pour un champ comme
private boolean isActive;
les noms de setter/getter appropriés sont
public boolean getIsActive() {
return isActive;
}
public void setIsActive(boolean isActive) {
this.isActive = isActive;
}
Vous avez donc deux solutions possibles. Changez votre getter/setter comme indiqué ci-dessus ou annotez votre champ avec @JsonProperty
pour que Jackson utilise le nom du champ pour déterminer le nom de la propriété
@JsonProperty
private boolean isActive;
Lorsque vous utilisez des bibliothèques comme lombok pour générer des getters et setters, n'ajoutez pas "is" avec le nom du champ si le type de champ est booléen. Parce que Jackson utilise la convention de bean de nommage par défaut Java et ajoute "is" lors de la définition des champs. L'ajout de "is" rend le mappage de champs incorrect