web-dev-qa-db-fra.com

La requête JSON Post pour le champ booléen envoie false par défaut

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;
}   
}
30
NewQueries

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;
76
Sotirios Delimanolis

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

0
Chinmay Biswal