import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.NonNull; import lombok.Value; /** * For "single-value" data types, Jackson and Spring MVC automatically look for instance or static "string" constructors. *

* We use @JsonCreator and a custom static ctor to add validation or any parsing logic to String */ @Value @AllArgsConstructor(access = AccessLevel.PRIVATE) // mark instance ctor private, only static ctor may use it public final class ImmutableStringElement { @NonNull String elementName; /** * any instantiation (code, Jackson & Spring MVC) will go through this static ctor - put validation logic here */ @JsonCreator public static ImmutableStringElement of(@JsonProperty("elementName") @NonNull String elementName) { // put validation logic here if (elementName.length() < 5) throw new IllegalArgumentException("name length must be >5"); return new ImmutableStringElement(elementName); } }