diff --git a/datamodel/odata-v4/odata-v4-generator/pom.xml b/datamodel/odata-v4/odata-v4-generator/pom.xml index 1beb671b4..ad9b88571 100644 --- a/datamodel/odata-v4/odata-v4-generator/pom.xml +++ b/datamodel/odata-v4/odata-v4-generator/pom.xml @@ -116,10 +116,6 @@ commons-io commons-io - - org.springframework - spring-core - com.sun.codemodel codemodel diff --git a/datamodel/odata-v4/odata-v4-generator/src/main/java/com/sap/cloud/sdk/datamodel/odatav4/generator/ODataToVdmGenerator.java b/datamodel/odata-v4/odata-v4-generator/src/main/java/com/sap/cloud/sdk/datamodel/odatav4/generator/ODataToVdmGenerator.java index 23e24cb5d..65e234cb6 100644 --- a/datamodel/odata-v4/odata-v4-generator/src/main/java/com/sap/cloud/sdk/datamodel/odatav4/generator/ODataToVdmGenerator.java +++ b/datamodel/odata-v4/odata-v4-generator/src/main/java/com/sap/cloud/sdk/datamodel/odatav4/generator/ODataToVdmGenerator.java @@ -5,8 +5,11 @@ import java.io.InputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.PathMatcher; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; @@ -33,7 +36,6 @@ import org.apache.olingo.commons.api.edm.provider.CsdlTerm; import org.apache.olingo.commons.api.format.ContentType; import org.slf4j.Logger; -import org.springframework.util.AntPathMatcher; import com.google.common.collect.Multimap; import com.sap.cloud.sdk.cloudplatform.util.StringUtils; @@ -392,16 +394,14 @@ private String getCanonicalPath( @Nullable final File outputDir ) private boolean excludePatternMatch( final String excludeFilePattern, final String serviceMetadataFilename ) { final List excludeFilePatternEach = new ArrayList<>(Arrays.asList(excludeFilePattern.split(","))); - final AntPathMatcher antPathMatcher = new AntPathMatcher(); + final FileSystem fileSystem = FileSystems.getDefault(); for( final String filePattern : excludeFilePatternEach ) { - if( antPathMatcher.match(filePattern, serviceMetadataFilename) ) { - logger - .info( - String - .format( - "Excluding metadata file %s, as it matches with the excludes pattern.", - serviceMetadataFilename)); + final PathMatcher pathMatcher = fileSystem.getPathMatcher("glob:" + filePattern.trim()); + + if( pathMatcher.matches(Paths.get(serviceMetadataFilename)) ) { + final String msg = "Excluding metadata file %s, as it matches with the excludes pattern."; + logger.info(String.format(msg, serviceMetadataFilename)); return true; } } diff --git a/datamodel/odata/odata-generator/pom.xml b/datamodel/odata/odata-generator/pom.xml index 9f1f3bc21..2fa38a774 100644 --- a/datamodel/odata/odata-generator/pom.xml +++ b/datamodel/odata/odata-generator/pom.xml @@ -117,10 +117,6 @@ - - org.springframework - spring-core - com.sun.codemodel codemodel diff --git a/datamodel/odata/odata-generator/src/main/java/com/sap/cloud/sdk/datamodel/odata/generator/ODataToVdmGenerator.java b/datamodel/odata/odata-generator/src/main/java/com/sap/cloud/sdk/datamodel/odata/generator/ODataToVdmGenerator.java index 14fd167fd..151193b8b 100644 --- a/datamodel/odata/odata-generator/src/main/java/com/sap/cloud/sdk/datamodel/odata/generator/ODataToVdmGenerator.java +++ b/datamodel/odata/odata-generator/src/main/java/com/sap/cloud/sdk/datamodel/odata/generator/ODataToVdmGenerator.java @@ -6,8 +6,11 @@ import java.lang.reflect.Field; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.PathMatcher; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; @@ -29,7 +32,6 @@ import org.apache.olingo.odata2.core.edm.provider.EdmImplProv; import org.apache.olingo.odata2.core.edm.provider.EdmxProvider; import org.slf4j.Logger; -import org.springframework.util.AntPathMatcher; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; @@ -349,19 +351,17 @@ private String getCanonicalPath( @Nullable final File outputDir ) } } - private boolean excludePatternMatch( final String excludeFilePattern, final String serviceMetadataFilename ) + static boolean excludePatternMatch( final String excludeFilePattern, final String serviceMetadataFilename ) { final List excludeFilePatternEach = new ArrayList<>(Arrays.asList(excludeFilePattern.split(","))); - final AntPathMatcher antPathMatcher = new AntPathMatcher(); + final FileSystem fileSystem = FileSystems.getDefault(); for( final String filePattern : excludeFilePatternEach ) { - if( antPathMatcher.match(filePattern, serviceMetadataFilename) ) { - logger - .info( - String - .format( - "Excluding metadata file %s, as it matches with the excludes pattern.", - serviceMetadataFilename)); + final PathMatcher pathMatcher = fileSystem.getPathMatcher("glob:" + filePattern.trim()); + + if( pathMatcher.matches(Paths.get(serviceMetadataFilename)) ) { + final String msg = "Excluding metadata file %s, as it matches with the excludes pattern."; + logger.info(String.format(msg, serviceMetadataFilename)); return true; } } diff --git a/datamodel/odata/odata-generator/src/test/java/com/sap/cloud/sdk/datamodel/odata/generator/ODataToVdmGeneratorTest.java b/datamodel/odata/odata-generator/src/test/java/com/sap/cloud/sdk/datamodel/odata/generator/ODataToVdmGeneratorTest.java new file mode 100644 index 000000000..ed508865c --- /dev/null +++ b/datamodel/odata/odata-generator/src/test/java/com/sap/cloud/sdk/datamodel/odata/generator/ODataToVdmGeneratorTest.java @@ -0,0 +1,34 @@ +package com.sap.cloud.sdk.datamodel.odata.generator; + +import static com.sap.cloud.sdk.datamodel.odata.generator.ODataToVdmGenerator.excludePatternMatch; + +import java.io.File; + +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.Test; + +public class ODataToVdmGeneratorTest +{ + @Test + void testExcludePatternMatch() + { + // Get file-name only, without path + final String fileName = new File("src/test/resources/sample/Spec.edmx").getName(); + + final SoftAssertions softly = new SoftAssertions(); + for( final String pattern : new String[] { "*.edmx", "*.*", "sp*c.edmx", "*.EDMX" } ) + softly + .assertThat(excludePatternMatch(pattern, fileName)) + .describedAs("%s matches %s", pattern, fileName) + .isTrue(); + + for( final String pattern : new String[] { "F", "*/*", "/resources/*/*.edmx", "/resources/*/*" } ) + softly + .assertThat(excludePatternMatch(pattern, fileName)) + .describedAs("%s not matches %s", pattern, fileName) + .isFalse(); + + softly.assertThat(excludePatternMatch("A,B,spec.edmx", fileName)).describedAs("fallback").isTrue(); + softly.assertAll(); + } +} diff --git a/datamodel/openapi/openapi-api-sample/pom.xml b/datamodel/openapi/openapi-api-sample/pom.xml index d373bb45e..732400ab7 100644 --- a/datamodel/openapi/openapi-api-sample/pom.xml +++ b/datamodel/openapi/openapi-api-sample/pom.xml @@ -28,6 +28,20 @@ https://www.sap.com + + + + org.springframework + spring-core + ${spring6.version} + + + org.springframework + spring-web + ${spring6.version} + + + com.sap.cloud.sdk.datamodel diff --git a/datamodel/openapi/openapi-core/pom.xml b/datamodel/openapi/openapi-core/pom.xml index 44d87216d..f9c1acca3 100644 --- a/datamodel/openapi/openapi-core/pom.xml +++ b/datamodel/openapi/openapi-core/pom.xml @@ -47,6 +47,7 @@ com.fasterxml.jackson.core jackson-databind + provided com.fasterxml.jackson.core @@ -55,10 +56,40 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + provided + + org.slf4j + slf4j-api + provided + + + tools.jackson.core + jackson-core + 3.0.2 + true + + + tools.jackson.core + jackson-databind + 3.0.2 + true + + + org.skyscreamer + jsonassert + 1.5.3 + test + org.springframework spring-core + + + commons-logging + commons-logging + + org.springframework @@ -110,6 +141,10 @@ com.fasterxml.jackson.core:jackson-core + + tools.jackson.core:jackson-core + org.skyscreamer:jsonassert + diff --git a/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClient.java b/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClient.java index fd0851050..92dec8792 100644 --- a/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClient.java +++ b/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClient.java @@ -9,6 +9,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -27,18 +28,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.client.BufferingClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriUtils; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.sap.cloud.sdk.cloudplatform.connectivity.ApacheHttpClient5Accessor; import com.sap.cloud.sdk.cloudplatform.connectivity.Destination; import com.sap.cloud.sdk.services.openapi.apiclient.auth.ApiKeyAuth; @@ -51,6 +47,8 @@ */ public final class ApiClient { + private static final ConverterPatcher[] CONVERTER_PATCHES = + { new ConverterPatcher.Jackson2(), new ConverterPatcher.Jackson3() }; /** * Enum representing the delimiter of a given collection. @@ -338,8 +336,7 @@ public ApiClient setUserAgent( @Nonnull final String userAgent ) @Nonnull public ApiClient addDefaultHeader( @Nonnull final String name, @Nonnull final String value ) { - defaultHeaders.remove(name); - defaultHeaders.add(name, value); + defaultHeaders.set(name, value); return this; } @@ -688,8 +685,7 @@ public T invokeAPI( // auth headers are added automatically by the SDK // updateParamsForAuth(authNames, queryParams, headerParams); - @SuppressWarnings( "deprecation" ) // spring-web:6.2.0 and later, works until <7.0.0 - final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path); + final UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(basePath).path(path); if( queryParams != null ) { //encode the query parameters in case they contain unsafe characters for( final List values : queryParams.values() ) { @@ -724,7 +720,7 @@ public T invokeAPI( final ResponseEntity responseEntity = restTemplate.exchange(requestEntity, returnType); statusCode = responseEntity.getStatusCode().value(); - responseHeaders = responseEntity.getHeaders(); + responseHeaders = extractHeadersMap(responseEntity.getHeaders()); if( statusCode == 204 ) { return null; @@ -737,6 +733,22 @@ public T invokeAPI( } } + @SuppressWarnings( "unchecked" ) + static MultiValueMap extractHeadersMap( @Nonnull final HttpHeaders headers ) + { + if( headers instanceof MultiValueMap ) { + return (MultiValueMap) headers; // until including Spring Framework 6 + } + try { + return (MultiValueMap) HttpHeaders.class + .getDeclaredMethod("asMultiValueMap") // since Spring Framework 7 + .invoke(headers); + } + catch( final Exception e ) { + return MultiValueMap.fromSingleValue(headers.toSingleValueMap()); // fallback + } + } + /** * Add headers to the request that is being built * @@ -748,14 +760,7 @@ public T invokeAPI( private void addHeadersToRequest( @Nullable final HttpHeaders headers, final BodyBuilder requestBuilder ) { if( headers != null ) { - for( final Entry> entry : headers.entrySet() ) { - final List values = entry.getValue(); - for( final String value : values ) { - if( value != null ) { - requestBuilder.header(entry.getKey(), value); - } - } - } + requestBuilder.headers(headers); } } @@ -763,28 +768,14 @@ private void addHeadersToRequest( @Nullable final HttpHeaders headers, final Bod private static RestTemplate newDefaultRestTemplate() { final RestTemplate restTemplate = new RestTemplate(); - - final ObjectMapper objectMapper = newDefaultObjectMapper(); - restTemplate - .getMessageConverters() - .stream() - .filter(MappingJackson2HttpMessageConverter.class::isInstance) - .map(MappingJackson2HttpMessageConverter.class::cast) - .forEach(converter -> converter.setObjectMapper(objectMapper)); - + final List> converters = new LinkedList<>(restTemplate.getMessageConverters()); + for( final ConverterPatcher patcher : CONVERTER_PATCHES ) { + patcher.patchList(converters); + } + restTemplate.setMessageConverters(converters); return restTemplate; } - @Nonnull - private static ObjectMapper newDefaultObjectMapper() - { - return new Jackson2ObjectMapperBuilder() - .modules(new JavaTimeModule()) - .visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE) - .visibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE) - .build(); - } - @Nonnull private static RestTemplate diff --git a/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/apiclient/ConverterPatcher.java b/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/apiclient/ConverterPatcher.java new file mode 100644 index 000000000..2950637e6 --- /dev/null +++ b/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/apiclient/ConverterPatcher.java @@ -0,0 +1,117 @@ +package com.sap.cloud.sdk.services.openapi.apiclient; + +import java.util.List; +import java.util.ListIterator; +import java.util.function.UnaryOperator; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; + +import lombok.extern.slf4j.Slf4j; + +// DO NOT IMPORT JACKSON CLASSES OTHER THAN ANNOTATIONS + +@FunctionalInterface +interface ConverterPatcher +{ + @Nullable + T patch( @Nonnull T instance ); + + default void patchList( @Nonnull final List instances ) + { + final ListIterator iterator = instances.listIterator(); + while( iterator.hasNext() ) { + final T instance = patch(iterator.next()); + if( instance != null ) { + iterator.set(instance); + } else { + iterator.remove(); + } + } + } + + @Slf4j + class Jackson2 implements ConverterPatcher + { + @SuppressWarnings( "removal" ) + @Override + public T patch( @Nonnull final T instance ) + { + final String springJacksonConverter = + "org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"; + final Class cl = instance.getClass(); + if( cl.getName().equals(springJacksonConverter) ) { + try { + final com.fasterxml.jackson.databind.ObjectMapper mapper = + new org.springframework.http.converter.json.Jackson2ObjectMapperBuilder() + .modules(new com.fasterxml.jackson.datatype.jsr310.JavaTimeModule()) + .visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE) + .visibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE) + .build(); + ((org.springframework.http.converter.json.MappingJackson2HttpMessageConverter) instance) + .setObjectMapper(mapper); + } + catch( final Exception e ) { + log.error("Failed to apply Jackson2 patch: " + e.getMessage(), e); + } + } + return instance; + } + } + + @Slf4j + class Jackson3 implements ConverterPatcher + { + @SuppressWarnings( "unchecked" ) + @Override + public T patch( @Nonnull final T instance ) + { + // run the following code respectively if the classes were available: + // + // Builder builder = ((JacksonJsonHttpMessageConverter) instance).getMapper().rebuild() + // .changeDefaultVisibility(v -> v + // .withGetterVisibility(JsonAutoDetect.Visibility.NONE) + // .withSetterVisibility(JsonAutoDetect.Visibility.NONE)); + // return (T) new JacksonJsonHttpMessageConverter(builder); + + final String springJacksonConverter = + "org.springframework.http.converter.json.JacksonJsonHttpMessageConverter"; + final Class cl = instance.getClass(); + if( cl.getName().equals(springJacksonConverter) ) { + final UnaryOperator vc = + v -> v + .withGetterVisibility(JsonAutoDetect.Visibility.NONE) + .withSetterVisibility(JsonAutoDetect.Visibility.NONE); + tools.jackson.databind.json.JsonMapper.Builder builder = + ((org.springframework.http.converter.json.JacksonJsonHttpMessageConverter) instance) + .getMapper() + .rebuild(); + builder = builder.changeDefaultVisibility(vc); + try { + final String jackson2SerName = "com.fasterxml.jackson.databind.JsonSerializable"; + final String serializerName = "tools.jackson.databind.ser.jackson.RawSerializer"; + final String moduleName = "tools.jackson.databind.module.SimpleModule"; + final Class jackson2ser = Class.forName(jackson2SerName); + final Object serializer = + Class.forName(serializerName).getConstructor(Class.class).newInstance(jackson2ser); + Object module = Class.forName(moduleName).getConstructor().newInstance(); + module = + module.getClass().getMethod("addSerializer", serializer.getClass()).invoke(module, serializer); + builder = + (tools.jackson.databind.json.JsonMapper.Builder) builder + .getClass() + .getMethod("addModule", module.getClass()) + .invoke(builder, module); + } + catch( final Exception e ) { + log.debug("Could not find Jackson2 JsonSerializable class to add ToStringSerializer.", e); + } + return (T) new org.springframework.http.converter.json.JacksonJsonHttpMessageConverter(builder); + } + return instance; + } + } +} diff --git a/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/core/OpenApiResponse.java b/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/core/OpenApiResponse.java index d0e4da65f..d6c6b6145 100644 --- a/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/core/OpenApiResponse.java +++ b/datamodel/openapi/openapi-core/src/main/java/com/sap/cloud/sdk/services/openapi/core/OpenApiResponse.java @@ -2,7 +2,7 @@ import javax.annotation.Nonnull; -import org.springframework.http.HttpHeaders; +import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import com.sap.cloud.sdk.services.openapi.apiclient.ApiClient; @@ -48,6 +48,6 @@ public OpenApiResponse( @Nonnull final ApiClient client ) public OpenApiResponse( final int statusCode ) { this.statusCode = statusCode; - headers = new HttpHeaders(); + headers = new LinkedMultiValueMap<>(); } } diff --git a/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClientTest.java b/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClientTest.java new file mode 100644 index 000000000..650b804d8 --- /dev/null +++ b/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClientTest.java @@ -0,0 +1,24 @@ +package com.sap.cloud.sdk.services.openapi.apiclient; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpHeaders; + +public class ApiClientTest +{ + + @Test + void testExtractHeadersMap() + { + HttpHeaders headers = new HttpHeaders(); + headers.add("foo", "bar"); + headers.add("baz", "qux"); + headers.add("baz", "quux"); + assertThat(ApiClient.extractHeadersMap(headers)) + .containsExactly(entry("foo", List.of("bar")), entry("baz", List.of("qux", "quux"))); + } +} diff --git a/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClientViaConstructorTest.java b/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClientViaConstructorTest.java index b7cda71d3..5a724771b 100644 --- a/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClientViaConstructorTest.java +++ b/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/apiclient/ApiClientViaConstructorTest.java @@ -64,7 +64,7 @@ void testApiClientDoesNotChangeTheGivenRestTemplate() server .expect(ExpectedCount.twice(), requestTo(BASE_PATH + RELATIVE_PATH)) .andExpect(method(HttpMethod.POST)) - .andExpect(content().string("{\"return\":\"Hello, World!\",\"Return\":\"Hello, World!\"}")) + .andExpect(content().json("{\"return\":\"Hello, World!\",\"Return\":\"Hello, World!\"}")) .andRespond(MockRestResponseCreators.withSuccess(SUCCESS_BODY, MediaType.TEXT_PLAIN)); // first service invocation diff --git a/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/genericparameter/GenericParameterTest.java b/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/genericparameter/GenericParameterTest.java index f50df180f..b2143de13 100644 --- a/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/genericparameter/GenericParameterTest.java +++ b/datamodel/openapi/openapi-core/src/test/java/com/sap/cloud/sdk/services/openapi/genericparameter/GenericParameterTest.java @@ -1,7 +1,7 @@ package com.sap.cloud.sdk.services.openapi.genericparameter; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; import static com.github.tomakehurst.wiremock.client.WireMock.post; import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; @@ -57,7 +57,7 @@ void testInvocationWithGenericParameter( @Nonnull final WireMockRuntimeInfo wm ) WireMock .stubFor( post(urlEqualTo("/api")) - .withRequestBody(equalTo(expectedBody)) + .withRequestBody(equalToJson(expectedBody)) .willReturn(aResponse().withStatus(HttpStatus.SC_OK))); final DefaultHttpDestination httpDestination = DefaultHttpDestination.builder(wm.getHttpBaseUrl()).build(); @@ -76,7 +76,7 @@ void testInvocationWithGenericParameter( @Nonnull final WireMockRuntimeInfo wm ) .fieldPopulatedAsStringWithoutAnnotation(jsonString) .fieldPopulatedAsJacksonJsonNode(jacksonJsonNode) .build()); - verify(postRequestedFor(urlEqualTo("/api")).withRequestBody(equalTo(expectedBody))); + verify(postRequestedFor(urlEqualTo("/api")).withRequestBody(equalToJson(expectedBody))); } @Value diff --git a/pom.xml b/pom.xml index f5b6d5f6a..dd874f3d9 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,8 @@ - 6.2.12 + 7.0.0 + 6.2.12 6.1.5 2.0.17 3.27.6