Skip to content

Problems with Builder pattern with XML #291

@cowtowncoder

Description

@cowtowncoder

(note: moved from FasterXML/jackson-module-jaxb-annotations#65 filed by @shahmalav )

Below is my POJO using builder pattern for Address.

@JsonDeserialize(builder = Address.AddressBuilder.class)
public final class Address {

    private final String address1;
    private final String city;
    private final String stateProvince;
    private final String postalCode;
    private final Country country;
    private final String county;

    private Address(AddressBuilder addressbuilder) {
        this.address1 = addressbuilder.address1;
        this.city = addressbuilder.city;
        this.stateProvince = addressbuilder.stateProvince;
        this.postalCode = addressbuilder.postalCode;
        this.country = addressbuilder.country;
        this.county = addressbuilder.county;
    }

    public String getAddress1() {
        return address1;
    }
    public String getCity() {
        return city;
    }

    public String getStateProvince() {
        return stateProvince;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public Country getCountry() {
        return country;
    }

    public String getCounty() {
        return county;
    }

    @JsonPOJOBuilder(withPrefix = "set")
    public static class AddressBuilder {
     
        @XmlElement(name = "Address1")
        private final String address1;

        @XmlElement(name = "City")
        private final String city;

        @XmlElement(name = "StateProvince")
        private final String stateProvince;

        @XmlElement(name = "PostalCode")
        private final String postalCode;

        @XmlElement(name = "Country")
        private final Country country;

        @XmlElement(name = "County")
        private String county;
        
        @JsonCreator
        public AddressBuilder(@JsonProperty("address1") String address1, @JsonProperty("city") String city, @JsonProperty("stateProvince") String stateProvince,
                @JsonProperty("postalCode") String postalCode, @JsonProperty("country") Country country) {
            this.address1 = address1;
            this.city = city;
            this.stateProvince = stateProvince;
            this.postalCode = postalCode;
            this.country = country;
        }

        public AddressBuilder setCounty(String county) {
            this.county = county;
            return this;
        }

        public Address build() {
            return new Address(this);
        }
    }
}

I can serialize and deserialize above class using JSON but when it comes to XML, it throws an exception.

Following is the stack trace:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Address1" (class com.wsgc.loyalty.service.model.Address$AddressBuilder), not marked as ignorable (8 known properties: "stateProvince", "country", "postalCode", "county", "city", "address1"])

 at [Source: java.io.StringReader@351d0846; line: 10, column: 11] (through reference chain: x.y.z.model.Address$AddressBuilder["Address1"])

Here is the XML representation of Address:

<Address>
    <Address1>111 Foo Bar</Address1>
    <City>San Francisco</City>
    <Country>USA</Country>
    <County>San Francisco</County>
    <StateProvince>CA</StateProvince>
    <PostalCode>94132</PostalCode>
</Address>

This model may not be the best example of builder-pattern.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions