Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] @JsonSetter annotation should be copied to builder's setter method #2168

Closed
dlutz opened this issue Jul 3, 2019 · 0 comments
Closed

Comments

@dlutz
Copy link

dlutz commented Jul 3, 2019

Describe the feature
Jackson's @JsonSetter annotation set on a field should be copied to the builder's corresponding setter method, similar to the jackson annotation @JsonProperty (see #1981).

Example Java class:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.Nulls;

import lombok.Builder;
import lombok.Setter;

@Builder
public class JacksonJsonSetter {
  @JsonProperty("some-attribute")
  @JsonSetter(nulls = Nulls.SKIP)
  @Setter
  @Builder.Default public String someAttribute = "default-value";
}

(I added @JsonProperty to show the similarity.)

This should produce something like this:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.Nulls;

public class JacksonJsonSetter {
  @JsonProperty("some-attribute")
  @JsonSetter(nulls = Nulls.SKIP)
  public String someAttribute;

  @java.lang.SuppressWarnings("all")
  @lombok.Generated
  private static String $default$someAttribute() {
    return "default-value";
  }

  @java.lang.SuppressWarnings("all")
  @lombok.Generated
  JacksonJsonSetter(final String someAttribute) {
    this.someAttribute = someAttribute;
  }


  @java.lang.SuppressWarnings("all")
  @lombok.Generated
  public static class JacksonJsonSetterBuilder {
    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    private boolean someAttribute$set;
    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    private String someAttribute;

    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    JacksonJsonSetterBuilder() {
    }

    @JsonProperty("some-attribute")
    @JsonSetter(nulls = Nulls.SKIP)
    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    public JacksonJsonSetterBuilder someAttribute(final String someAttribute) {
      this.someAttribute = someAttribute;
      someAttribute$set = true;
      return this;
    }

    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    public JacksonJsonSetter build() {
      String someAttribute = this.someAttribute;
      if (!someAttribute$set) someAttribute = JacksonJsonSetter.$default$someAttribute();
      return new JacksonJsonSetter(someAttribute);
    }

    @java.lang.Override
    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    public java.lang.String toString() {
      return "JacksonJsonSetter.JacksonJsonSetterBuilder(someAttribute=" + this.someAttribute + ")";
    }
  }

  @java.lang.SuppressWarnings("all")
  @lombok.Generated
  public static JacksonJsonSetterBuilder builder() {
    return new JacksonJsonSetterBuilder();
  }

  @JsonProperty("some-attribute")
  @JsonSetter(nulls = Nulls.SKIP)
  @java.lang.SuppressWarnings("all")
  @lombok.Generated
  public void setSomeAttribute(final String someAttribute) {
    this.someAttribute = someAttribute;
  }
}

Describe the target audience
People wanting to use the @JsonSetter annotation to influence the deserialization of some JSON attributes.

In my project, I wanted to use @JsonSetter(nulls = Nulls.SKIP) to force setting a default value if the field is set to null in the JSON input. I needed to manually add the annotation to the setters by using an interface, as recommended on @Builder / With Jackson. If this annotation was copied to the builder's setter methods, I could avoid the additional code in this interface.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant