Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jackson + Builder Pattern?

I'd like Jackson to deserialize a class with the following constructor:

public Clinic(String name, Address address) 

Deserializing the first argument is easy. The problem is that Address is defined as:

public class Address {   private Address(Map<LocationType, String> components)   ...    public static class Builder {     public Builder setCity(String value);     public Builder setCountry(String value);     public Address create();   } } 

and is constructed like this: new Address.Builder().setCity("foo").setCountry("bar").create();

Is there a way to get key-value pairs from Jackson in order to construct the Address myself? Alternatively, is there a way to get Jackson to use the Builder class itself?

like image 885
Gili Avatar asked Feb 13 '11 03:02

Gili


People also ask

Does Jackson use builder?

Jackson Deserialization Using Lombok Builders This class is also immutable and it has a private constructor. Hence, we can create instances only through its builder. This is enough to use this class for deserialization with Jackson. Also notice that Lombok uses build as the default name of the build method.

What is JSON pojo builder?

The @JsonPOJOBuilder annotation is used to configure a builder class to customize deserialization of a JSON document to recover POJOs when the naming convention is different from the default.

Does Jackson need a constructor?

11.2. Jackson won't use a constructor with arguments by default, you'd need to tell it to do so with the @JsonCreator annotation. By default it tries to use the no-args constructor which isn't present in your class.

What is Jacksonized?

Overview. The @Jacksonized annotation is an add-on annotation for @Builder and @SuperBuilder . It automatically configures the generated builder class to be used by Jackson's deserialization. It only has an effect if present at a context where there is also a @Builder or a @SuperBuilder ; a warning is emitted otherwise ...


1 Answers

As long as you are using Jackson 2+, then there is now built in support for this.

First you need to add this annotation to your Address class:

@JsonDeserialize(builder = Address.Builder.class) 

Then you need to add this annotation to your Builder class:

@JsonPOJOBuilder(buildMethodName = "create", withPrefix = "set") 

You can skip this second annotation if you are happy to rename your Builder's create method to build, and your Builder's setters to be prefixed to with, instead of set.

Full example:

@JsonDeserialize(builder = Address.Builder.class) public class Address {   private Address(Map<LocationType, String> components)   ...    @JsonPOJOBuilder(buildMethodName = "create", withPrefix = "set")   public static class Builder   {     public Builder setCity(String value);     public Builder setCountry(String value);     public Address create();   } } 
like image 128
Rupert Madden-Abbott Avatar answered Nov 15 '22 18:11

Rupert Madden-Abbott