Deserialize Builder Class without using Jacksonized

27 Views Asked by At

I can successfully deserialize my builder class using @Jacksonized

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@Jacksonized
public class Person {
    Private String firstName;  
    Private String lastName; 
    @JsonDeserialize(contentAs=AgeClassImpl1.class) 
    Private AgeClass age;  // AgeClass interface has 2 implementations but I always to use impl1

    Public static Person create(final String fN, final String lN, final AgeClass age) {
        PersonBuilder builder = PersonBuilder.builder()
                                .firstName(fN)
                                .lastName(lN)
                                .age(age);
        builder.build()
    }
}

However, I need to get rid of @Jacksonized. To achieve the same effect as @Jacksonized, I manually added the annotations as shown below:

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonDeserialize(builder=Person.PersonBuilder.class)
public class Person {
    Private String firstName;  
    Private String lastName; 
    @JsonDeserialize(contentAs=AgeClassImpl1.class) 
    Private AgeClass age;  // AgeClass interface has 2 implementations but I always to use impl1


    @JsonPOJOBuilder(withPrefix="")
    public static class PersonBuilder {}

    Public static Person create(final String fN, final String lN, final AgeClass age) {
        PersonBuilder builder = PersonBuilder.builder()
                                .firstName(fN)
                                .lastName(lN)
                                .age(age);
        builder.build()
    }
}

Getting error:

InvalidDefinitionException: Cannot construct instance of AgeClass (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information.

1

There are 1 best solutions below

1
Aniket Sharma On

Try adding @NoArgsConstructor or also known as default/empty constructor in your AgeClass. As to deserialize, empty constructor is used. You have used it in Person class, but check once in AgeClass