web-dev-qa-db-fra.com

Modèle de générateur de Lombok avec Jackson JsonProperty

J'ai construit un objet Java en utilisant lombok avec un modèle de générateur. Mais, j'obtiens l'exception suivante lorsque j'essaie de désérialiser un objet Java en utilisant Jackson. Cela se produit pour les champs qui ont @JsonProperty annotation.

Exception dans le thread "principal" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: champ non reconnu "nom_utilisateur" (classe User $ UserBuilder), non marqué comme ignorable (2 propriétés connues: "nom_utilisateur", "ID_utilisateur"]))
sur [Source: (String) "{" userId ": 1," user_name ":" username "}"; ligne: 1, colonne: 26] (via la chaîne de référence: User $ UserBuilder ["nom_utilisateur"])

Code utilisé:

public class TestJson {
    public static void main(String args[]) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        User user = User.builder()
                .userName("username")
                .userId(1)
                .build();
        System.out.println(user);
        String string = objectMapper.writeValueAsString(user);
        System.out.println(string);
        user = objectMapper.readValue(string, User.class);
        System.out.println(user);
    }
}


@JsonDeserialize(builder = User.UserBuilder.class)
@Getter
@ToString
@Builder(toBuilder = true)
class User {
    @JsonProperty("user_name")
    @NonNull
    private String userName;

    @JsonProperty
    private int userId;

    @JsonPOJOBuilder(withPrefix = "")
    public static class UserBuilder {

    }
}

Veuillez m'aider à résoudre ce problème.

Merci.

7
suraj1291993

Vous obtenez cette erreur parce que Jackson ne sait pas mapper user_name À l'un de vos champs UserBuilder.

Vous avez également besoin de @JsonProperty("user_name") dans le champ userName de UserBuilder, comme ceci:

@JsonPOJOBuilder(withPrefix = "")
public static class UserBuilder {

    @JsonProperty("user_name")
    @NonNull
    private String userName;
}
8
Tomasz Linkowski

Votre mappeur doit avoir un moyen de créer une classe d'utilisateurs.

Vous pouvez utiliser le constructeur:

@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
@Builder
class User {
  @JsonProperty("user_name")
  @NonNull
  private String userName;

  private int userId;
}

... ou pointez-le vers le constructeur selon Tomasz Linkowski 's answer

3
diginoise