diff --git a/CHANGELOG.md b/CHANGELOG.md index 8174d2a804a..137ca9b17f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ #### Bugs * Fix #6038: Support for Gradle configuration cache * Fix #6214: Java generator does not recognize fields in CRDs other than metadata, spec, and status +* Fix #6342: UnmatchedFieldTypeModule prevents certain jackson features from working #### Improvements * Fix #5264: Remove deprecated `Config.errorMessages` field diff --git a/kubernetes-model-generator/kubernetes-model-common/src/main/java/io/fabric8/kubernetes/model/jackson/SettableBeanPropertyDelegate.java b/kubernetes-model-generator/kubernetes-model-common/src/main/java/io/fabric8/kubernetes/model/jackson/SettableBeanPropertyDelegate.java index 021864e308a..d6cf4324bda 100644 --- a/kubernetes-model-generator/kubernetes-model-common/src/main/java/io/fabric8/kubernetes/model/jackson/SettableBeanPropertyDelegate.java +++ b/kubernetes-model-generator/kubernetes-model-common/src/main/java/io/fabric8/kubernetes/model/jackson/SettableBeanPropertyDelegate.java @@ -16,18 +16,12 @@ package io.fabric8.kubernetes.model.jackson; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationConfig; import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.PropertyName; -import com.fasterxml.jackson.databind.deser.NullValueProvider; import com.fasterxml.jackson.databind.deser.SettableAnyProperty; import com.fasterxml.jackson.databind.deser.SettableBeanProperty; import com.fasterxml.jackson.databind.exc.MismatchedInputException; -import com.fasterxml.jackson.databind.introspect.AnnotatedMember; import java.io.IOException; -import java.lang.annotation.Annotation; import java.util.function.BooleanSupplier; /** @@ -37,15 +31,13 @@ * A fall-back mechanism is implemented in the deserializeAndSet methods to allow field values that don't match the * target type to be preserved in the anySetter method if exists. */ -public class SettableBeanPropertyDelegate extends SettableBeanProperty { +public class SettableBeanPropertyDelegate extends SettableBeanProperty.Delegating { - private final SettableBeanProperty delegate; private final SettableAnyProperty anySetter; private final transient BooleanSupplier useAnySetter; SettableBeanPropertyDelegate(SettableBeanProperty delegate, SettableAnyProperty anySetter, BooleanSupplier useAnySetter) { super(delegate); - this.delegate = delegate; this.anySetter = anySetter; this.useAnySetter = useAnySetter; } @@ -54,48 +46,8 @@ public class SettableBeanPropertyDelegate extends SettableBeanProperty { * {@inheritDoc} */ @Override - public SettableBeanProperty withValueDeserializer(JsonDeserializer deser) { - return new SettableBeanPropertyDelegate(delegate.withValueDeserializer(deser), anySetter, useAnySetter); - } - - /** - * {@inheritDoc} - */ - @Override - public SettableBeanProperty withName(PropertyName newName) { - return new SettableBeanPropertyDelegate(delegate.withName(newName), anySetter, useAnySetter); - } - - /** - * {@inheritDoc} - */ - @Override - public SettableBeanProperty withNullProvider(NullValueProvider nva) { - return new SettableBeanPropertyDelegate(delegate.withNullProvider(nva), anySetter, useAnySetter); - } - - /** - * {@inheritDoc} - */ - @Override - public AnnotatedMember getMember() { - return delegate.getMember(); - } - - /** - * {@inheritDoc} - */ - @Override - public A getAnnotation(Class acls) { - return delegate.getAnnotation(acls); - } - - /** - * {@inheritDoc} - */ - @Override - public void fixAccess(DeserializationConfig config) { - delegate.fixAccess(config); + protected SettableBeanProperty withDelegate(SettableBeanProperty d) { + return new SettableBeanPropertyDelegate(d, anySetter, useAnySetter); } /** @@ -154,22 +106,6 @@ public Object deserializeSetAndReturn(JsonParser p, DeserializationContext ctxt, return null; } - /** - * {@inheritDoc} - */ - @Override - public void set(Object instance, Object value) throws IOException { - delegate.set(instance, value); - } - - /** - * {@inheritDoc} - */ - @Override - public Object setAndReturn(Object instance, Object value) throws IOException { - return delegate.setAndReturn(instance, value); - } - private boolean shouldUseAnySetter() { if (anySetter == null) { return false; diff --git a/kubernetes-model-generator/kubernetes-model-common/src/test/java/io/fabric8/kubernetes/model/jackson/SettableBeanPropertyDelegateTest.java b/kubernetes-model-generator/kubernetes-model-common/src/test/java/io/fabric8/kubernetes/model/jackson/SettableBeanPropertyDelegateTest.java index f61d6f5f42e..cd3a57ec34e 100644 --- a/kubernetes-model-generator/kubernetes-model-common/src/test/java/io/fabric8/kubernetes/model/jackson/SettableBeanPropertyDelegateTest.java +++ b/kubernetes-model-generator/kubernetes-model-common/src/test/java/io/fabric8/kubernetes/model/jackson/SettableBeanPropertyDelegateTest.java @@ -57,7 +57,8 @@ void setUp() { @DisplayName("withValueDeserializer, should return a new instance") void withValueDeserializer() { // Given - doReturn(delegateMock).when(delegateMock).withValueDeserializer(any()); + SettableBeanProperty secondDelegateMock = mock(SettableBeanProperty.class, RETURNS_DEEP_STUBS); + doReturn(secondDelegateMock).when(delegateMock).withValueDeserializer(any()); // When final SettableBeanProperty result = settableBeanPropertyDelegate.withValueDeserializer(null); // Then @@ -65,14 +66,15 @@ void withValueDeserializer() { .isInstanceOf(SettableBeanPropertyDelegate.class) .isNotSameAs(settableBeanPropertyDelegate) .hasFieldOrPropertyWithValue("anySetter", anySetterMock) - .hasFieldOrPropertyWithValue("delegate", delegateMock); + .hasFieldOrPropertyWithValue("delegate", secondDelegateMock); } @Test @DisplayName("withName, should return a new instance") void withName() { // Given - doReturn(delegateMock).when(delegateMock).withName(any()); + SettableBeanProperty secondDelegateMock = mock(SettableBeanProperty.class, RETURNS_DEEP_STUBS); + doReturn(secondDelegateMock).when(delegateMock).withName(any()); // When final SettableBeanProperty result = settableBeanPropertyDelegate.withName(null); // Then @@ -80,14 +82,15 @@ void withName() { .isInstanceOf(SettableBeanPropertyDelegate.class) .isNotSameAs(settableBeanPropertyDelegate) .hasFieldOrPropertyWithValue("anySetter", anySetterMock) - .hasFieldOrPropertyWithValue("delegate", delegateMock); + .hasFieldOrPropertyWithValue("delegate", secondDelegateMock); } @Test @DisplayName("withNullProvider, should return a new instance") void withNullProvider() { // Given - doReturn(delegateMock).when(delegateMock).withNullProvider(any()); + SettableBeanProperty secondDelegateMock = mock(SettableBeanProperty.class, RETURNS_DEEP_STUBS); + doReturn(secondDelegateMock).when(delegateMock).withNullProvider(any()); // When final SettableBeanProperty result = settableBeanPropertyDelegate.withNullProvider(null); // Then @@ -95,7 +98,7 @@ void withNullProvider() { .isInstanceOf(SettableBeanPropertyDelegate.class) .isNotSameAs(settableBeanPropertyDelegate) .hasFieldOrPropertyWithValue("anySetter", anySetterMock) - .hasFieldOrPropertyWithValue("delegate", delegateMock); + .hasFieldOrPropertyWithValue("delegate", secondDelegateMock); } @Test @@ -109,6 +112,17 @@ void getMember() { assertThat(result).isEqualTo("the-member"); } + @Test + @DisplayName("getCreatorIndex, should return delegate's creator index") + void getCreatorIndex() { + // Given + when(delegateMock.getCreatorIndex()).thenReturn(3); + // When + final int result = settableBeanPropertyDelegate.getCreatorIndex(); + // Then + assertThat(result).isEqualTo(3); + } + @Test @DisplayName("getAnnotation, should return delegate's Annotation") void getAnnotation() {