From ce03ee008b671a74f313fc9d4a3ffb6a483810f3 Mon Sep 17 00:00:00 2001 From: "Adrian E. Hjertstedt" Date: Fri, 25 Mar 2022 14:30:25 +0000 Subject: [PATCH] Harden detection of InaccessibleObjectException in MetadataUtil (#1766) The immediate cause under JDK16+ is not always InaccessibleObjectException meaning the fallback logic to copy properties does not kick in. Additional logic is needed to harden the detection of the InaccessibleObjectException to ensure it is catered for in the fallback logic. Co-authored-by: Adrian Hjertstedt --- .../cloud/contract/verifier/util/MetadataUtil.java | 5 ++++- .../messaging/amqp/SpringAmqpStubMessagesSpec.groovy | 2 -- .../contract/verifier/messaging/amqp/AmqpMetadataTests.java | 3 --- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/MetadataUtil.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/MetadataUtil.java index 76d8effdc8..3ab96a6fbc 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/MetadataUtil.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/MetadataUtil.java @@ -33,6 +33,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.PropertyWriter; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; @@ -93,7 +94,9 @@ public final class MetadataUtil { return MAPPER.readerForUpdating(objectToMerge).readValue(bytes); } catch (Exception e) { - if (e.getClass().toString().contains("InaccessibleObjectException")) { + if (e.getClass().toString().contains("InaccessibleObjectException") + || (e instanceof InvalidDefinitionException + && e.getMessage().contains("InaccessibleObjectException"))) { // JDK 16 workaround - ObjectMapper seems not be JDK16 compatible // with the setup present in Spring Cloud Contract. So we will not // allow patching but we will just copy values from the patch to diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessagesSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessagesSpec.groovy index c4b4623d49..121b084368 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessagesSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/messaging/amqp/SpringAmqpStubMessagesSpec.groovy @@ -18,7 +18,6 @@ package org.springframework.cloud.contract.verifier.messaging.amqp import com.rabbitmq.client.Channel import org.mockito.exceptions.verification.WantedButNotInvoked -import spock.lang.IgnoreIf import spock.lang.Specification import org.springframework.amqp.core.Binding @@ -41,7 +40,6 @@ import static org.springframework.amqp.support.converter.DefaultClassMapper.DEFA /** * @author Mathias Düsterhöft */ -@IgnoreIf({ jvm.isJava17Compatible() }) class SpringAmqpStubMessagesSpec extends Specification { RabbitTemplate rabbitTemplate = mock(RabbitTemplate.class) diff --git a/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/messaging/amqp/AmqpMetadataTests.java b/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/messaging/amqp/AmqpMetadataTests.java index 4ca6f1f48f..a006b4d9dc 100644 --- a/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/messaging/amqp/AmqpMetadataTests.java +++ b/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/messaging/amqp/AmqpMetadataTests.java @@ -19,8 +19,6 @@ package org.springframework.cloud.contract.verifier.messaging.amqp; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnJre; -import org.junit.jupiter.api.condition.JRE; import static org.assertj.core.api.BDDAssertions.then; @@ -28,7 +26,6 @@ class AmqpMetadataTests { YAMLMapper mapper = new YAMLMapper(); - @DisabledOnJre(JRE.JAVA_17) @Test void should_parse_the_metadata_entry() throws JsonProcessingException { // @formatter:off