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() {