I can't see why this would be immediately. Would it be possible to create a simple github repo, or package this up as a maven project? I could have a look to see what gives.
-+ Tatu +- On Mon, Oct 10, 2016 at 6:42 PM, Brent Ryan <[email protected]> wrote: > Here's the custom deserializer: https://github.com/jonpeterson/jackson- > module-model-versioning/blob/master/src/main/java/com/ > github/jonpeterson/jackson/module/versioning/VersionedModelDeserializer. > java > > Some more details here: > https://github.com/immutables/immutables/issues/461 > > and here: > https://github.com/jonpeterson/jackson-module-model-versioning/issues/6 > > > Basically when calling readValue like this deserialize() gets called 2 > times. > > ObjectMapper m = new ObjectMapper(); > m.registerModule(new VersioningModule()); > > String json = > "{\"field\":\"f\",\"anotherField\":\"a\",\"modelVersion\":\"1\"}"; > Entity pe = m.readValue(json, Entity.class); > > > > The ImmutableEntity that gets generated by annotation processor is the > following: > > /** > * Immutable implementation of {@link Entity}. > * <p> > * Use the builder to create immutable instances: > * {@code ImmutableEntity.builder()}. > */ > @SuppressWarnings({"all"}) > @SuppressFBWarnings > @ParametersAreNonnullByDefault > @Generated({"Immutables.generator", "Entity"}) > @Immutable > @CheckReturnValue > @JsonVersionedModel(currentVersion = "1", defaultDeserializeToVersion = "0", > versionToSuppressPropertySerialization = "0") > public final class ImmutableEntity implements Entity { > private final @Nullable String serializeToVersion; > private final String field; > private final String anotherField; > > private ImmutableEntity( > @Nullable String serializeToVersion, > String field, > String anotherField) { > this.serializeToVersion = serializeToVersion; > this.field = field; > this.anotherField = anotherField; > } > > /** > * @return The value of the {@code serializeToVersion} attribute > */ > @JsonProperty("serializeToVersion") > @JsonSerializeToVersion(defaultToSource = true) > @Override > public @Nullable String getSerializeToVersion() { > return serializeToVersion; > } > > /** > * @return The field > */ > @JsonProperty("field") > @Override > public String field() { > return field; > } > > /** > * @return another field > */ > @JsonProperty("anotherField") > @Override > public String getAnotherField() { > return anotherField; > } > > /** > * Copy the current immutable object by setting a value for the {@link > Entity#getSerializeToVersion() serializeToVersion} attribute. > * An equals check used to prevent copying of the same value by returning > {@code this}. > * @param value A new value for serializeToVersion (can be {@code null}) > * @return A modified copy of the {@code this} object > */ > public final ImmutableEntity withSerializeToVersion(@Nullable String value) > { > if (Objects.equals(this.serializeToVersion, value)) return this; > return new ImmutableEntity(value, this.field, this.anotherField); > } > > /** > * Copy the current immutable object by setting a value for the {@link > Entity#field() field} attribute. > * An equals check used to prevent copying of the same value by returning > {@code this}. > * @param value A new value for field > * @return A modified copy of the {@code this} object > */ > public final ImmutableEntity withField(String value) { > if (this.field.equals(value)) return this; > String newValue = Objects.requireNonNull(value, "field"); > return new ImmutableEntity(this.serializeToVersion, newValue, > this.anotherField); > } > > /** > * Copy the current immutable object by setting a value for the {@link > Entity#getAnotherField() anotherField} attribute. > * An equals check used to prevent copying of the same value by returning > {@code this}. > * @param value A new value for anotherField > * @return A modified copy of the {@code this} object > */ > public final ImmutableEntity withAnotherField(String value) { > if (this.anotherField.equals(value)) return this; > String newValue = Objects.requireNonNull(value, "anotherField"); > return new ImmutableEntity(this.serializeToVersion, this.field, newValue); > } > > /** > * This instance is equal to all instances of {@code ImmutableEntity} that > have equal attribute values. > * @return {@code true} if {@code this} is equal to {@code another} instance > */ > @Override > public boolean equals(@Nullable Object another) { > if (this == another) return true; > return another instanceof ImmutableEntity > && equalTo((ImmutableEntity) another); > } > > private boolean equalTo(ImmutableEntity another) { > return Objects.equals(serializeToVersion, another.serializeToVersion) > && field.equals(another.field) > && anotherField.equals(another.anotherField); > } > > /** > * Computes a hash code from attributes: {@code serializeToVersion}, {@code > field}, {@code anotherField}. > * @return hashCode value > */ > @Override > public int hashCode() { > int h = 31; > h = h * 17 + Objects.hashCode(serializeToVersion); > h = h * 17 + field.hashCode(); > h = h * 17 + anotherField.hashCode(); > return h; > } > > /** > * Prints the immutable value {@code Entity} with attribute values. > * @return A string representation of the value > */ > @Override > public String toString() { > return "Entity{" > + "serializeToVersion=" + serializeToVersion > + ", field=" + field > + ", anotherField=" + anotherField > + "}"; > } > > /** > * Utility type used to correctly read immutable object from JSON > representation. > * @deprecated Do not use this type directly, it exists only for the > <em>Jackson</em>-binding infrastructure > */ > @Deprecated > @JsonDeserialize > @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE) > static final class Json implements Entity { > @Nullable String serializeToVersion; > @Nullable String field; > @Nullable String anotherField; > @JsonProperty("serializeToVersion") > @JsonSerializeToVersion(defaultToSource = true) > public void setSerializeToVersion(@Nullable String serializeToVersion) { > this.serializeToVersion = serializeToVersion; > } > @JsonProperty("field") > public void setField(String field) { > this.field = field; > } > @JsonProperty("anotherField") > public void setAnotherField(String anotherField) { > this.anotherField = anotherField; > } > @Override > public String getSerializeToVersion() { throw new > UnsupportedOperationException(); } > @Override > public String field() { throw new UnsupportedOperationException(); } > @Override > public String getAnotherField() { throw new > UnsupportedOperationException(); } > } > > /** > * @param json A JSON-bindable data structure > * @return An immutable value type > * @deprecated Do not use this method directly, it exists only for the > <em>Jackson</em>-binding infrastructure > */ > @Deprecated > @JsonCreator(mode = JsonCreator.Mode.DEFAULT) > static ImmutableEntity fromJson(Json json) { > ImmutableEntity.Builder builder = ImmutableEntity.builder(); > if (json.serializeToVersion != null) { > builder.serializeToVersion(json.serializeToVersion); > } > if (json.field != null) { > builder.field(json.field); > } > if (json.anotherField != null) { > builder.anotherField(json.anotherField); > } > return builder.build(); > } > > /** > * Creates an immutable copy of a {@link Entity} value. > * Uses accessors to get values to initialize the new immutable instance. > * If an instance is already immutable, it is returned as is. > * @param instance The instance to copy > * @return A copied immutable Entity instance > */ > public static ImmutableEntity copyOf(Entity instance) { > if (instance instanceof ImmutableEntity) { > return (ImmutableEntity) instance; > } > return ImmutableEntity.builder() > .from(instance) > .build(); > } > > /** > * Creates a builder for {@link ImmutableEntity ImmutableEntity}. > * @return A new ImmutableEntity builder > */ > public static ImmutableEntity.Builder builder() { > return new ImmutableEntity.Builder(); > } > > /** > * Builds instances of type {@link ImmutableEntity ImmutableEntity}. > * Initialize attributes and then invoke the {@link #build()} method to > create an > * immutable instance. > * <p><em>{@code Builder} is not thread-safe and generally should not be > stored in a field or collection, > * but instead used immediately to create instances.</em> > */ > @NotThreadSafe > public static final class Builder { > private static final long INIT_BIT_FIELD = 0x1L; > private static final long INIT_BIT_ANOTHER_FIELD = 0x2L; > private long initBits = 0x3L; > > private @Nullable String serializeToVersion; > private @Nullable String field; > private @Nullable String anotherField; > > private Builder() { > } > > /** > * Fill a builder with attribute values from the provided {@code Entity} > instance. > * Regular attribute values will be replaced with those from the given > instance. > * Absent optional values will not replace present values. > * @param instance The instance from which to copy values > * @return {@code this} builder for use in a chained invocation > */ > public final Builder from(Entity instance) { > Objects.requireNonNull(instance, "instance"); > @Nullable String serializeToVersionValue = > instance.getSerializeToVersion(); > if (serializeToVersionValue != null) { > serializeToVersion(serializeToVersionValue); > } > field(instance.field()); > anotherField(instance.getAnotherField()); > return this; > } > > /** > * Initializes the value for the {@link Entity#getSerializeToVersion() > serializeToVersion} attribute. > * @param serializeToVersion The value for serializeToVersion (can be > {@code null}) > * @return {@code this} builder for use in a chained invocation > */ > public final Builder serializeToVersion(@Nullable String > serializeToVersion) { > this.serializeToVersion = serializeToVersion; > return this; > } > > /** > * Initializes the value for the {@link Entity#field() field} attribute. > * @param field The value for field > * @return {@code this} builder for use in a chained invocation > */ > public final Builder field(String field) { > this.field = Objects.requireNonNull(field, "field"); > initBits &= ~INIT_BIT_FIELD; > return this; > } > > /** > * Initializes the value for the {@link Entity#getAnotherField() > anotherField} attribute. > * @param anotherField The value for anotherField > * @return {@code this} builder for use in a chained invocation > */ > public final Builder anotherField(String anotherField) { > this.anotherField = Objects.requireNonNull(anotherField, > "anotherField"); > initBits &= ~INIT_BIT_ANOTHER_FIELD; > return this; > } > > /** > * Builds a new {@link ImmutableEntity ImmutableEntity}. > * @return An immutable instance of Entity > * @throws java.lang.IllegalStateException if any required attributes are > missing > */ > public ImmutableEntity build() { > if (initBits != 0) { > throw new IllegalStateException(formatRequiredAttributesMessage()); > } > return new ImmutableEntity(serializeToVersion, field, anotherField); > } > > private String formatRequiredAttributesMessage() { > List<String> attributes = new ArrayList<String>(); > if ((initBits & INIT_BIT_FIELD) != 0) attributes.add("field"); > if ((initBits & INIT_BIT_ANOTHER_FIELD) != 0) > attributes.add("anotherField"); > return "Cannot build Entity, some of required attributes are not set " > + attributes; > } > } > } > > > > Any ideas? > > -- > You received this message because you are subscribed to the Google Groups > "jackson-user" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "jackson-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. For more options, visit https://groups.google.com/d/optout.
