web-dev-qa-db-ja.com

jackson JsonPropertyを使用したLombokビルダーパターン

Java Builderパターン付きのLombokを使用してオブジェクトを構築しました。しかし、Jacksonを使用してJavaオブジェクトをデシリアライズしようとすると、次の例外が発生します。 @JsonPropertyアノテーションを持つフィールドの場合。

スレッド "main"の例外com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:認識できないフィールド "user_name"(クラスUser $ UserBuilder)、無視可能としてマークされていない(2つの既知のプロパティ: "userName"、 "userId"])
at [ソース:(文字列) "{" userId ":1、" user_name ":" username "}";行:1、列:26](参照チェーンを介して:User $ UserBuilder ["user_name"])

使用コード:

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 {

    }
}

この問題の解決にご協力ください。

ありがとう。

7
suraj1291993

ジャクソンは_user_name_をUserBuilderフィールドにマッピングする方法を知らないため、このエラーが発生します。

userNameUserBuilderフィールドにも@JsonProperty("user_name")が必要です。

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

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

マッパーには、Userクラスを作成する手段が必要です。

コンストラクタを使用できます:

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

  private int userId;
}

...または Tomasz Linkowski の回答に従って、ビルダーをポイントします

3
diginoise