diff --git a/.circleci/config.yml b/.circleci/config.yml index 414b063a86..928fd9bfe4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,27 +12,12 @@ # the License. # -orbs: - android: circleci/android@1.0.3 - # common executors executors: java: - parameters: - version: - description: 'jdk version to use' - default: '8' - type: string - docker: - - image: circleci/openjdk:<> - android: - parameters: - version: - description: 'jdk version to use' - default: '8' - type: string docker: - - image: circleci/openjdk:<> + - image: velo/toolchains-4-ci-builds + # common commands commands: resolve-dependencies: @@ -41,7 +26,7 @@ commands: - run: name: 'Resolving Dependencies' command: | - mvn dependency:resolve-plugins go-offline:resolve-dependencies -DskipTests=true -B + ./mvnw -ntp dependency:resolve-plugins go-offline:resolve-dependencies -DskipTests=true -B verify-formatting: steps: - run: @@ -59,17 +44,8 @@ commands: - run: name: 'Deploy Core Modules Sonatype' command: | - mvn -nsu -s .circleci/settings.xml -P release -pl -:feign-benchmark -DskipTests=true deploy - nexus-deploy-jdk11: - steps: - - run: - name: 'Build JDK 11 Release modules locally' - command: | - mvn -B -nsu -s .circleci/settings.xml -P java11 -pl :feign-java11,:feign-jakarta -am -DskipTests=true install - - run: - name: 'Deploy JDK 11 Modules to Sonatype' - command: | - mvn -B -nsu -s .circleci/settings.xml -P release,java11 -pl :feign-java11,:feign-jakarta -DskipTests=true deploy + ./mvnw -ntp -nsu -s .circleci/settings.xml -P release -pl -:feign-benchmark -DskipTests=true deploy + # our job defaults defaults: &defaults working_directory: ~/feign @@ -98,14 +74,8 @@ version: 2.1 jobs: test: - parameters: - jdk: - description: 'jdk version to use' - default: '8' - type: string executor: name: java - version: <> <<: *defaults steps: - checkout @@ -121,30 +91,12 @@ jobs: - run: name: 'Test' command: | - mvn -B test + ./mvnw -ntp -B test - verify-formatting - android-test: - # These next lines define the Android machine image executor: https://circleci.com/docs/2.0/executor-types/ - executor: - name: android/android-machine - - steps: - # Checkout the code as the first step. - - checkout - - # The next step will run the unit tests - - android/run-tests: - test-command: ./gradlew lint testDebug --continue deploy: - parameters: - jdk: - description: 'jdk version to use' - default: '8' - type: string executor: name: java - version: <> <<: *defaults steps: - checkout @@ -156,82 +108,25 @@ jobs: - configure-gpg - nexus-deploy - deploy-jdk11: - parameters: - jdk: - description: 'jdk version to use' - default: '11' - type: string - executor: - name: java - version: <> - <<: *defaults - steps: - - checkout - - restore_cache: - keys: - - feign-dependencies-{{ checksum "pom.xml" }} - - feign-dependencies- - - resolve-dependencies - - configure-gpg - - nexus-deploy-jdk11 - workflows: version: 2 build: jobs: - test: - jdk: '8' - name: 'jdk 8' - filters: - <<: *all-branches - - test: - jdk: '11' - name: 'jdk 11' - filters: - <<: *all-branches - - test: - jdk: '17-buster' - name: 'jdk 17' + name: 'pr-build' filters: <<: *all-branches - - test: - name: 'android test' - snapshot: jobs: - test: - jdk: '8' - name: 'jdk 8' - filters: - <<: *master-only - - test: - jdk: '11' - name: 'jdk 11' - filters: - <<: *master-only - - test: - jdk: '17-buster' - name: 'jdk 17' + name: 'snapshot' filters: <<: *master-only - deploy: - jdk: '8' name: 'deploy snapshot' requires: - - 'jdk 8' - - 'jdk 11' - - 'jdk 17' - context: Sonatype - filters: - <<: *master-only - - deploy-jdk11: - jdk: '11' - name: 'deploy jdk11 snapshot modules' - requires: - - 'jdk 11' - - 'deploy snapshot' + - 'snapshot' context: Sonatype filters: <<: *master-only @@ -239,17 +134,7 @@ workflows: release: jobs: - deploy: - jdk: '8' name: 'release to maven central' context: Sonatype filters: <<: *tags-only - - deploy-jdk11: - jdk: '11' - name: 'release jdk11 artifacts to maven central' - requires: - - 'release to maven central' - context: Sonatype - filters: - <<: *tags-only - diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar index c6feb8bb6f..bf82ff01c6 100644 Binary files a/.mvn/wrapper/maven-wrapper.jar and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index c9023edfe7..9f220ace17 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1 +1,2 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip \ No newline at end of file +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar \ No newline at end of file diff --git a/annotation-error-decoder/pom.xml b/annotation-error-decoder/pom.xml index 7bd3e3cfac..7f481fccd1 100644 --- a/annotation-error-decoder/pom.xml +++ b/annotation-error-decoder/pom.xml @@ -1,7 +1,7 @@ - - - javax.xml.bind - jaxb-api - 2.3.1 - - - org.glassfish.jaxb - jaxb-runtime - 2.4.0-b180830.0438 - test - - - - + + com.sun.xml.bind + jaxb-impl + 2.3.8 + test + + diff --git a/jackson-jaxb/src/main/java/feign/jackson/jaxb/JacksonJaxbJsonDecoder.java b/jackson-jaxb/src/main/java/feign/jackson/jaxb/JacksonJaxbJsonDecoder.java index 99ed14a11b..3e4e202804 100644 --- a/jackson-jaxb/src/main/java/feign/jackson/jaxb/JacksonJaxbJsonDecoder.java +++ b/jackson-jaxb/src/main/java/feign/jackson/jaxb/JacksonJaxbJsonDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jackson-jaxb/src/main/java/feign/jackson/jaxb/JacksonJaxbJsonEncoder.java b/jackson-jaxb/src/main/java/feign/jackson/jaxb/JacksonJaxbJsonEncoder.java index 5b96677f6e..c36994eb51 100644 --- a/jackson-jaxb/src/main/java/feign/jackson/jaxb/JacksonJaxbJsonEncoder.java +++ b/jackson-jaxb/src/main/java/feign/jackson/jaxb/JacksonJaxbJsonEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jackson-jaxb/src/test/java/feign/jackson/jaxb/JacksonJaxbCodecTest.java b/jackson-jaxb/src/test/java/feign/jackson/jaxb/JacksonJaxbCodecTest.java index 9da5bac7a7..6c9fd30dd3 100644 --- a/jackson-jaxb/src/test/java/feign/jackson/jaxb/JacksonJaxbCodecTest.java +++ b/jackson-jaxb/src/test/java/feign/jackson/jaxb/JacksonJaxbCodecTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jackson-jr/pom.xml b/jackson-jr/pom.xml index af738ad8e0..d7b3370b3f 100644 --- a/jackson-jr/pom.xml +++ b/jackson-jr/pom.xml @@ -1,7 +1,7 @@ - - - javax.xml.bind - jaxb-api - 2.3.1 - - - org.glassfish.jaxb - jaxb-runtime - 2.4.0-b180830.0438 - test - - - - - java17 - - [17,] - + + javax.xml.bind + jaxb-api + 2.3.1 + - - - - jakarta.xml.bind - jakarta.xml.bind-api - 4.0.0 - - - org.glassfish.jaxb - jaxb-core - 4.0.1 - test - - - - + + + com.sun.xml.bind + jaxb-impl + 2.3.8 + test + + diff --git a/jaxb/src/main/java/feign/jaxb/JAXBContextCacheKey.java b/jaxb/src/main/java/feign/jaxb/JAXBContextCacheKey.java new file mode 100644 index 0000000000..8df9c5be87 --- /dev/null +++ b/jaxb/src/main/java/feign/jaxb/JAXBContextCacheKey.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb; + +/** + * Encapsulate data used to build the cache key of JAXBContext. + */ +interface JAXBContextCacheKey { +} diff --git a/jaxb/src/main/java/feign/jaxb/JAXBContextClassCacheKey.java b/jaxb/src/main/java/feign/jaxb/JAXBContextClassCacheKey.java new file mode 100644 index 0000000000..ba8dbcf575 --- /dev/null +++ b/jaxb/src/main/java/feign/jaxb/JAXBContextClassCacheKey.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb; + +import java.util.Objects; + +/** + * Encapsulate data used to build the cache key of JAXBContext when created using class mode. + */ +final class JAXBContextClassCacheKey implements JAXBContextCacheKey { + + private final Class clazz; + + JAXBContextClassCacheKey(Class clazz) { + this.clazz = clazz; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + JAXBContextClassCacheKey that = (JAXBContextClassCacheKey) o; + return clazz.equals(that.clazz); + } + + @Override + public int hashCode() { + return Objects.hash(clazz); + } +} diff --git a/jaxb/src/main/java/feign/jaxb/JAXBContextFactory.java b/jaxb/src/main/java/feign/jaxb/JAXBContextFactory.java index f4e4327e37..232b889c7c 100644 --- a/jaxb/src/main/java/feign/jaxb/JAXBContextFactory.java +++ b/jaxb/src/main/java/feign/jaxb/JAXBContextFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at @@ -31,12 +31,15 @@ */ public final class JAXBContextFactory { - private final ConcurrentHashMap, JAXBContext> jaxbContexts = + private final ConcurrentHashMap jaxbContexts = new ConcurrentHashMap<>(64); private final Map properties; + private final JAXBContextInstantationMode jaxbContextInstantationMode; - private JAXBContextFactory(Map properties) { + private JAXBContextFactory(Map properties, + JAXBContextInstantationMode jaxbContextInstantationMode) { this.properties = properties; + this.jaxbContextInstantationMode = jaxbContextInstantationMode; } /** @@ -62,10 +65,12 @@ private void setMarshallerProperties(Marshaller marshaller) throws PropertyExcep } private JAXBContext getContext(Class clazz) throws JAXBException { - JAXBContext jaxbContext = this.jaxbContexts.get(clazz); + JAXBContextCacheKey cacheKey = jaxbContextInstantationMode.getJAXBContextCacheKey(clazz); + JAXBContext jaxbContext = this.jaxbContexts.get(cacheKey); + if (jaxbContext == null) { - jaxbContext = JAXBContext.newInstance(clazz); - this.jaxbContexts.putIfAbsent(clazz, jaxbContext); + jaxbContext = jaxbContextInstantationMode.getJAXBContext(clazz); + this.jaxbContexts.putIfAbsent(cacheKey, jaxbContext); } return jaxbContext; } @@ -91,6 +96,9 @@ public static class Builder { private final Map properties = new HashMap<>(10); + private JAXBContextInstantationMode jaxbContextInstantationMode = + JAXBContextInstantationMode.CLASS; + /** * Sets the jaxb.encoding property of any Marshaller created by this factory. */ @@ -149,12 +157,31 @@ public Builder withProperty(String key, Object value) { return this; } + /** + * Provide an instantiation mode for JAXB Contexts, can be class or package, default is class if + * this method is not called. + * + *

+ * Example :
+ *
+ * + * new JAXBContextFactory.Builder() + * .withJAXBContextInstantiationMode(JAXBContextInstantationMode.PACKAGE) + * .build(); + * + *

+ */ + public Builder withJAXBContextInstantiationMode(JAXBContextInstantationMode jaxbContextInstantiationMode) { + this.jaxbContextInstantationMode = jaxbContextInstantiationMode; + return this; + } + /** * Creates a new {@link feign.jaxb.JAXBContextFactory} instance with a lazy loading cached * context */ public JAXBContextFactory build() { - return new JAXBContextFactory(properties); + return new JAXBContextFactory(properties, jaxbContextInstantationMode); } /** @@ -167,7 +194,7 @@ public JAXBContextFactory build() { * likely due to missing JAXB annotations */ public JAXBContextFactory build(List> classes) throws JAXBException { - JAXBContextFactory factory = new JAXBContextFactory(properties); + JAXBContextFactory factory = new JAXBContextFactory(properties, jaxbContextInstantationMode); factory.preloadContextCache(classes); return factory; } diff --git a/jaxb/src/main/java/feign/jaxb/JAXBContextInstantationMode.java b/jaxb/src/main/java/feign/jaxb/JAXBContextInstantationMode.java new file mode 100644 index 0000000000..3afcc57da1 --- /dev/null +++ b/jaxb/src/main/java/feign/jaxb/JAXBContextInstantationMode.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; + +/** + * Provides differents ways to instantiate a JAXB Context. + */ +public enum JAXBContextInstantationMode { + + CLASS { + @Override + JAXBContextCacheKey getJAXBContextCacheKey(Class clazz) { + return new JAXBContextClassCacheKey(clazz); + } + + @Override + JAXBContext getJAXBContext(Class clazz) throws JAXBException { + return JAXBContext.newInstance(clazz); + } + }, + + PACKAGE { + @Override + JAXBContextCacheKey getJAXBContextCacheKey(Class clazz) { + return new JAXBContextPackageCacheKey(clazz.getPackage().getName(), clazz.getClassLoader()); + } + + @Override + JAXBContext getJAXBContext(Class clazz) throws JAXBException { + return JAXBContext.newInstance(clazz.getPackage().getName(), clazz.getClassLoader()); + } + }; + + abstract JAXBContextCacheKey getJAXBContextCacheKey(Class clazz); + + abstract JAXBContext getJAXBContext(Class clazz) throws JAXBException; +} diff --git a/jaxb/src/main/java/feign/jaxb/JAXBContextPackageCacheKey.java b/jaxb/src/main/java/feign/jaxb/JAXBContextPackageCacheKey.java new file mode 100644 index 0000000000..55c8d9a814 --- /dev/null +++ b/jaxb/src/main/java/feign/jaxb/JAXBContextPackageCacheKey.java @@ -0,0 +1,46 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb; + +import java.util.Objects; + +/** + * Encapsulate data used to build the cache key of JAXBContext when created using package mode. + */ +final class JAXBContextPackageCacheKey implements JAXBContextCacheKey { + + private final String packageName; + + private final ClassLoader classLoader; + + JAXBContextPackageCacheKey(String packageName, ClassLoader classLoader) { + this.packageName = packageName; + this.classLoader = classLoader; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + JAXBContextPackageCacheKey that = (JAXBContextPackageCacheKey) o; + return packageName.equals(that.packageName) && classLoader.equals(that.classLoader); + } + + @Override + public int hashCode() { + return Objects.hash(packageName, classLoader); + } +} diff --git a/jaxb/src/main/java/feign/jaxb/JAXBDecoder.java b/jaxb/src/main/java/feign/jaxb/JAXBDecoder.java index 0b1e9b3543..d79fdc8aa0 100644 --- a/jaxb/src/main/java/feign/jaxb/JAXBDecoder.java +++ b/jaxb/src/main/java/feign/jaxb/JAXBDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jaxb/src/main/java/feign/jaxb/JAXBEncoder.java b/jaxb/src/main/java/feign/jaxb/JAXBEncoder.java index 716cd0a7c1..ef846e2e44 100644 --- a/jaxb/src/main/java/feign/jaxb/JAXBEncoder.java +++ b/jaxb/src/main/java/feign/jaxb/JAXBEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jaxb/src/test/java/feign/jaxb/JAXBCodecTest.java b/jaxb/src/test/java/feign/jaxb/JAXBCodecTest.java index 0f3b39e4d7..7c4daa2129 100644 --- a/jaxb/src/test/java/feign/jaxb/JAXBCodecTest.java +++ b/jaxb/src/test/java/feign/jaxb/JAXBCodecTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jaxb/src/test/java/feign/jaxb/JAXBContextFactoryTest.java b/jaxb/src/test/java/feign/jaxb/JAXBContextFactoryTest.java index 166071952c..d84d61cbcb 100644 --- a/jaxb/src/test/java/feign/jaxb/JAXBContextFactoryTest.java +++ b/jaxb/src/test/java/feign/jaxb/JAXBContextFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at @@ -13,16 +13,15 @@ */ package feign.jaxb; +import feign.jaxb.mock.onepackage.AnotherMockedJAXBObject; +import feign.jaxb.mock.onepackage.MockedJAXBObject; +import org.junit.Test; +import javax.xml.bind.Marshaller; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; import java.util.Map; -import org.junit.Test; -import javax.xml.bind.Marshaller; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; public class JAXBContextFactoryTest { @@ -88,9 +87,65 @@ public void testPreloadCache() throws Exception { Map internalCache = (Map) f.get(factory); // IllegalAccessException assertFalse(internalCache.isEmpty()); assertTrue(internalCache.size() == classes.size()); - assertNotNull(internalCache.get(String.class)); - assertNotNull(internalCache.get(Integer.class)); + assertNotNull(internalCache.get(new JAXBContextClassCacheKey(String.class))); + assertNotNull(internalCache.get(new JAXBContextClassCacheKey(Integer.class))); } + @Test + public void testClassModeInstantiation() throws Exception { + + List> classes = Arrays.asList(String.class, Integer.class); + JAXBContextFactory factory = + new JAXBContextFactory.Builder() + .withJAXBContextInstantiationMode(JAXBContextInstantationMode.CLASS) + .build(classes); + + Field f = factory.getClass().getDeclaredField("jaxbContexts"); // NoSuchFieldException + f.setAccessible(true); + Map internalCache = (Map) f.get(factory); // IllegalAccessException + assertFalse(internalCache.isEmpty()); + assertEquals(internalCache.size(), classes.size()); + assertNotNull(internalCache.get(new JAXBContextClassCacheKey(String.class))); + assertNotNull(internalCache.get(new JAXBContextClassCacheKey(Integer.class))); + + } + + @Test + public void testPackageModeInstantiationUsingSamePackage() throws Exception { + + JAXBContextFactory factory = new JAXBContextFactory.Builder() + .withJAXBContextInstantiationMode(JAXBContextInstantationMode.PACKAGE) + .build(Arrays.asList(MockedJAXBObject.class, AnotherMockedJAXBObject.class)); + + Field f = factory.getClass().getDeclaredField("jaxbContexts"); // NoSuchFieldException + f.setAccessible(true); + Map internalCache = (Map) f.get(factory); // IllegalAccessException + assertFalse(internalCache.isEmpty()); + assertEquals(1, internalCache.size()); + assertNotNull(internalCache.get(new JAXBContextPackageCacheKey("feign.jaxb.mock.onepackage", + AnotherMockedJAXBObject.class.getClassLoader()))); + + } + + @Test + public void testPackageModeInstantiationUsingMultiplePackages() throws Exception { + + JAXBContextFactory factory = new JAXBContextFactory.Builder() + .withJAXBContextInstantiationMode(JAXBContextInstantationMode.PACKAGE) + .build(Arrays.asList(MockedJAXBObject.class, + feign.jaxb.mock.anotherpackage.MockedJAXBObject.class)); + + Field f = factory.getClass().getDeclaredField("jaxbContexts"); // NoSuchFieldException + f.setAccessible(true); + Map internalCache = (Map) f.get(factory); // IllegalAccessException + assertFalse(internalCache.isEmpty()); + assertEquals(2, internalCache.size()); + assertNotNull(internalCache.get(new JAXBContextPackageCacheKey("feign.jaxb.mock.onepackage", + MockedJAXBObject.class.getClassLoader()))); + assertNotNull(internalCache.get(new JAXBContextPackageCacheKey("feign.jaxb.mock.anotherpackage", + feign.jaxb.mock.anotherpackage.MockedJAXBObject.class.getClassLoader()))); + + + } } diff --git a/jaxb/src/test/java/feign/jaxb/examples/AWSSignatureVersion4.java b/jaxb/src/test/java/feign/jaxb/examples/AWSSignatureVersion4.java index 9a86a21e68..797acd7c9f 100644 --- a/jaxb/src/test/java/feign/jaxb/examples/AWSSignatureVersion4.java +++ b/jaxb/src/test/java/feign/jaxb/examples/AWSSignatureVersion4.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jaxb/src/test/java/feign/jaxb/examples/IAMExample.java b/jaxb/src/test/java/feign/jaxb/examples/IAMExample.java index ffef83728d..048c257497 100644 --- a/jaxb/src/test/java/feign/jaxb/examples/IAMExample.java +++ b/jaxb/src/test/java/feign/jaxb/examples/IAMExample.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jaxb/src/test/java/feign/jaxb/examples/package-info.java b/jaxb/src/test/java/feign/jaxb/examples/package-info.java index 42a06febbb..8e92791718 100644 --- a/jaxb/src/test/java/feign/jaxb/examples/package-info.java +++ b/jaxb/src/test/java/feign/jaxb/examples/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jaxb/src/test/java/feign/jaxb/mock/anotherpackage/MockedJAXBObject.java b/jaxb/src/test/java/feign/jaxb/mock/anotherpackage/MockedJAXBObject.java new file mode 100644 index 0000000000..a282436275 --- /dev/null +++ b/jaxb/src/test/java/feign/jaxb/mock/anotherpackage/MockedJAXBObject.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb.mock.anotherpackage; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "anothertest") +public class MockedJAXBObject { +} diff --git a/jaxb/src/test/java/feign/jaxb/mock/anotherpackage/ObjectFactory.java b/jaxb/src/test/java/feign/jaxb/mock/anotherpackage/ObjectFactory.java new file mode 100644 index 0000000000..441922c818 --- /dev/null +++ b/jaxb/src/test/java/feign/jaxb/mock/anotherpackage/ObjectFactory.java @@ -0,0 +1,24 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb.mock.anotherpackage; + +import javax.xml.bind.annotation.XmlRegistry; + +@XmlRegistry +public class ObjectFactory { + + public MockedJAXBObject createMockedJAXBObject() { + return new MockedJAXBObject(); + } +} diff --git a/jaxb/src/test/java/feign/jaxb/mock/onepackage/AnotherMockedJAXBObject.java b/jaxb/src/test/java/feign/jaxb/mock/onepackage/AnotherMockedJAXBObject.java new file mode 100644 index 0000000000..cf6e7f61d0 --- /dev/null +++ b/jaxb/src/test/java/feign/jaxb/mock/onepackage/AnotherMockedJAXBObject.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb.mock.onepackage; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class AnotherMockedJAXBObject { +} diff --git a/jaxb/src/test/java/feign/jaxb/mock/onepackage/MockedJAXBObject.java b/jaxb/src/test/java/feign/jaxb/mock/onepackage/MockedJAXBObject.java new file mode 100644 index 0000000000..bd4ae97696 --- /dev/null +++ b/jaxb/src/test/java/feign/jaxb/mock/onepackage/MockedJAXBObject.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb.mock.onepackage; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "test") +public class MockedJAXBObject { +} diff --git a/jaxb/src/test/java/feign/jaxb/mock/onepackage/ObjectFactory.java b/jaxb/src/test/java/feign/jaxb/mock/onepackage/ObjectFactory.java new file mode 100644 index 0000000000..59195dce09 --- /dev/null +++ b/jaxb/src/test/java/feign/jaxb/mock/onepackage/ObjectFactory.java @@ -0,0 +1,28 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxb.mock.onepackage; + +import javax.xml.bind.annotation.XmlRegistry; + +@XmlRegistry +public class ObjectFactory { + + public MockedJAXBObject createMockedJAXBObject() { + return new MockedJAXBObject(); + } + + public AnotherMockedJAXBObject createAnotherMockedJAXBObject() { + return new AnotherMockedJAXBObject(); + } +} diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml index f4096acecd..5667f61db8 100644 --- a/jaxrs/pom.xml +++ b/jaxrs/pom.xml @@ -1,7 +1,7 @@ - 1.8 - java18 ${project.basedir}/.. - 1.8 - 1.8 + + true @@ -42,6 +39,12 @@ feign-core + + javax.ws.rs + javax.ws.rs-api + 2.1.1 + + ${project.groupId} feign-jaxrs @@ -53,12 +56,6 @@ - - javax.ws.rs - javax.ws.rs-api - 2.1.1 - - ${project.groupId} @@ -77,18 +74,24 @@ feign-jaxrs test-jar test + + + javax.ws.rs + jsr311-api + + org.glassfish.jersey.core jersey-client - 2.37 + 2.39.1 test org.glassfish.jersey.inject jersey-hk2 - 2.37 + 2.39.1 test diff --git a/jaxrs2/src/main/java/feign/jaxrs2/JAXRS2Contract.java b/jaxrs2/src/main/java/feign/jaxrs2/JAXRS2Contract.java index 2a67a36d60..094d3f4f62 100644 --- a/jaxrs2/src/main/java/feign/jaxrs2/JAXRS2Contract.java +++ b/jaxrs2/src/main/java/feign/jaxrs2/JAXRS2Contract.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at @@ -13,10 +13,13 @@ */ package feign.jaxrs2; -import javax.ws.rs.BeanParam; +import feign.jaxrs.JAXRSContract; +import javax.ws.rs.*; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.Context; -import feign.jaxrs.JAXRSContract; +import java.lang.reflect.Field; +import static feign.Util.checkState; +import static feign.Util.emptyToNull; /** * Please refer to the Feign @@ -31,7 +34,67 @@ public JAXRS2Contract() { // https://github.com/OpenFeign/feign/issues/669 super.registerParameterAnnotation(Suspended.class, (ann, data, i) -> data.ignoreParamater(i)); super.registerParameterAnnotation(Context.class, (ann, data, i) -> data.ignoreParamater(i)); - super.registerParameterAnnotation(BeanParam.class, (ann, data, i) -> data.ignoreParamater(i)); + } + @Override + protected void registerParamAnnotations() { + super.registerParamAnnotations(); + + registerParameterAnnotation(BeanParam.class, (param, data, paramIndex) -> { + final Field[] aggregatedParams = data.method() + .getParameters()[paramIndex] + .getType() + .getDeclaredFields(); + + for (Field aggregatedParam : aggregatedParams) { + + if (aggregatedParam.isAnnotationPresent(PathParam.class)) { + final String name = aggregatedParam.getAnnotation(PathParam.class).value(); + checkState( + emptyToNull(name) != null, + "BeanParam parameter %s contains PathParam with empty .value() on field %s", + paramIndex, + aggregatedParam.getName()); + nameParam(data, name, paramIndex); + } + + if (aggregatedParam.isAnnotationPresent(QueryParam.class)) { + final String name = aggregatedParam.getAnnotation(QueryParam.class).value(); + checkState( + emptyToNull(name) != null, + "BeanParam parameter %s contains QueryParam with empty .value() on field %s", + paramIndex, + aggregatedParam.getName()); + final String query = addTemplatedParam(name); + data.template().query(name, query); + nameParam(data, name, paramIndex); + } + + if (aggregatedParam.isAnnotationPresent(HeaderParam.class)) { + final String name = aggregatedParam.getAnnotation(HeaderParam.class).value(); + checkState( + emptyToNull(name) != null, + "BeanParam parameter %s contains HeaderParam with empty .value() on field %s", + paramIndex, + aggregatedParam.getName()); + final String header = addTemplatedParam(name); + data.template().header(name, header); + nameParam(data, name, paramIndex); + } + + if (aggregatedParam.isAnnotationPresent(FormParam.class)) { + final String name = aggregatedParam.getAnnotation(FormParam.class).value(); + checkState( + emptyToNull(name) != null, + "BeanParam parameter %s contains FormParam with empty .value() on field %s", + paramIndex, + aggregatedParam.getName()); + data.formParams().add(name); + nameParam(data, name, paramIndex); + } + } + }); + + } } diff --git a/jaxrs2/src/main/java/feign/jaxrs2/JAXRSClient.java b/jaxrs2/src/main/java/feign/jaxrs2/JAXRSClient.java index 2f278c6451..a223c7e4a1 100644 --- a/jaxrs2/src/main/java/feign/jaxrs2/JAXRSClient.java +++ b/jaxrs2/src/main/java/feign/jaxrs2/JAXRSClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jaxrs2/src/test/java/feign/jaxrs2/JAXRS2ContractTest.java b/jaxrs2/src/test/java/feign/jaxrs2/JAXRS2ContractTest.java index d16d34f57e..826e084338 100644 --- a/jaxrs2/src/test/java/feign/jaxrs2/JAXRS2ContractTest.java +++ b/jaxrs2/src/test/java/feign/jaxrs2/JAXRS2ContractTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/jaxrs2/src/test/java/feign/jaxrs2/JAXRS2ContractWithBeanParamSupportTest.java b/jaxrs2/src/test/java/feign/jaxrs2/JAXRS2ContractWithBeanParamSupportTest.java new file mode 100644 index 0000000000..53cd84aa09 --- /dev/null +++ b/jaxrs2/src/test/java/feign/jaxrs2/JAXRS2ContractWithBeanParamSupportTest.java @@ -0,0 +1,92 @@ +/* + * Copyright 2012-2023 The Feign Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package feign.jaxrs2; + +import feign.MethodMetadata; +import feign.jaxrs.JAXRSContract; +import feign.jaxrs.JAXRSContractTest; +import feign.jaxrs2.JAXRS2ContractWithBeanParamSupportTest.Jaxrs2Internals.BeanParamInput; +import org.junit.Test; +import javax.ws.rs.*; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.UriInfo; +import static feign.assertj.FeignAssertions.assertThat; +import static java.util.Arrays.asList; +import static org.assertj.core.data.MapEntry.entry; + +/** + * Tests interfaces defined per {@link JAXRS2Contract} are interpreted into expected + * {@link feign .RequestTemplate template} instances. + */ +public class JAXRS2ContractWithBeanParamSupportTest extends JAXRSContractTest { + + @Override + protected JAXRSContract createContract() { + return new JAXRS2Contract(); + } + + @Test + public void injectJaxrsInternals() throws Exception { + final MethodMetadata methodMetadata = + parseAndValidateMetadata(Jaxrs2Internals.class, "inject", AsyncResponse.class, + UriInfo.class); + assertThat(methodMetadata.template()) + .noRequestBody(); + } + + @Test + public void injectBeanParam() throws Exception { + final MethodMetadata methodMetadata = + parseAndValidateMetadata(Jaxrs2Internals.class, "beanParameters", BeanParamInput.class); + assertThat(methodMetadata.template()) + .noRequestBody(); + + assertThat(methodMetadata.template()) + .hasHeaders(entry("X-Custom-Header", asList("{X-Custom-Header}"))); + assertThat(methodMetadata.template()) + .hasQueries(entry("query", asList("{query}"))); + assertThat(methodMetadata.formParams()) + .isNotEmpty() + .containsExactly("form"); + + } + + public interface Jaxrs2Internals { + @GET + @Path("/") + void inject(@Suspended AsyncResponse ar, @Context UriInfo info); + + @Path("/{path}") + @POST + void beanParameters(@BeanParam BeanParamInput beanParam); + + public class BeanParamInput { + + @PathParam("path") + String path; + + @QueryParam("query") + String query; + + @FormParam("form") + String form; + + @HeaderParam("X-Custom-Header") + String header; + } + } + +} diff --git a/jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java b/jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java index c8c4e62bdf..b28d0d27cb 100644 --- a/jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java +++ b/jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/json/pom.xml b/json/pom.xml index 47ca63a911..fe302de981 100644 --- a/json/pom.xml +++ b/json/pom.xml @@ -1,7 +1,7 @@ -Duser.language=en 1.8 - java18 + 17 ${main.java.version} @@ -79,38 +82,38 @@ 4.10.0 31.1-jre - 1.42.3 - 2.10 - 2.0.4 + 1.43.1 + 2.10.1 + 2.0.7 1.70 - 20220924 + 20230227 4.13.2 - 5.9.1 - 2.14.0 - 2.14.0 - 3.23.1 + 5.9.2 + 2.14.2 + 2.14.2 + 3.24.2 2.2 - 4.9.0 + 5.2.0 - 1.22 - 3.10.1 - 3.1.0 + 3.11.0 + 3.1.1 3.2.1 - 3.4.1 - 4.1 + 3.5.0 + 4.2 3.3.0 - 2.5.3 + 3.0.0 5.1.8 0.1.1 - 2.22.2 - 0.93.1 + 3.0.0 + 0.94.0 file://${project.basedir}/src/config/bom.xml - 1.13.0 - 2.13.0 + 2.0.0 + 2.15.0 3.0.1 - 3.0.0 + 3.1.1 1.2.2 + 1.0.0.RC3 https://github.com/openfeign/feign 2012 @@ -310,12 +313,6 @@ ${hamcrest.version} - - org.jvnet - animal-sniffer-annotation - 1.0 - - com.google.code.gson gson @@ -420,15 +417,9 @@ + clean install - - - io.takari - maven - 0.7.7 - - maven-compiler-plugin ${maven-compiler-plugin.version} @@ -452,20 +443,93 @@ true false ${jvm.options} + + ${latest.java.version} + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-surefire-plugin.version} + + true + false + + ${latest.java.version} + - - - - org.ow2.asm - asm - 9.4 - - + + org.apache.maven.plugins + maven-toolchains-plugin + 3.1.0 + + + + toolchain + + + + + ${main.java.version} + + + + + + test + generate-test-sources + + toolchain + + + + + ${latest.java.version} + + + + + + + + + org.moditect + moditect-maven-plugin + ${moditect-maven-plugin.version} + + + add-module-infos + package + + add-module-info + + + ${moditect.skip} + true + + + + + *; + + true + + + + --multi-release=9 + + + + + + maven-compiler-plugin true @@ -497,40 +561,13 @@ -parameters - ${main.java.version} - ${main.java.version} + ${latest.java.version} + ${latest.java.version} - - org.codehaus.mojo - animal-sniffer-maven-plugin - ${animal-sniffer-maven-plugin.version} - - - org.codehaus.mojo.signature - ${main.signature.artifact} - 1.0 - - - - - - check - - - - - - org.ow2.asm - asm - 9.4 - - - - maven-install-plugin ${maven-install-plugin.version} @@ -665,7 +702,7 @@ com.github.ekryd.sortpom sortpom-maven-plugin - 2.15.0 + 3.2.1 true \n @@ -751,7 +788,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.1.0 + 3.3.0 enforce-no-repositories @@ -783,16 +820,6 @@ file:///${project.basedir}/src/config/bom.xml - - java11 - - [11,) - - - java11 - jakarta - - validateCodeFormat diff --git a/reactive/pom.xml b/reactive/pom.xml index 9cad54c444..2e7f431364 100644 --- a/reactive/pom.xml +++ b/reactive/pom.xml @@ -1,7 +1,7 @@ - - - javax.xml.bind - jaxb-api - 2.3.1 - - - org.glassfish.jaxb - jaxb-runtime - 2.4.0-b180830.0438 - test - - - javax.xml.ws - jaxws-api - 2.3.1 - - - com.sun.xml.messaging.saaj - saaj-impl - 1.5.1 - - - - + + javax.xml.ws + jaxws-api + 2.3.1 + + + javax.xml.bind + jaxb-api + 2.3.1 + + + com.sun.xml.messaging.saaj + saaj-impl + 1.5.3 + + + com.sun.xml.bind + jaxb-impl + 2.3.8 + test + + diff --git a/soap/src/main/java/feign/soap/SOAPDecoder.java b/soap/src/main/java/feign/soap/SOAPDecoder.java index 8e92b80daf..93b8541246 100644 --- a/soap/src/main/java/feign/soap/SOAPDecoder.java +++ b/soap/src/main/java/feign/soap/SOAPDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/soap/src/main/java/feign/soap/SOAPEncoder.java b/soap/src/main/java/feign/soap/SOAPEncoder.java index 8a72bd997f..77c44018d5 100644 --- a/soap/src/main/java/feign/soap/SOAPEncoder.java +++ b/soap/src/main/java/feign/soap/SOAPEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/soap/src/main/java/feign/soap/SOAPErrorDecoder.java b/soap/src/main/java/feign/soap/SOAPErrorDecoder.java index d561dfe714..aae2d0b69a 100644 --- a/soap/src/main/java/feign/soap/SOAPErrorDecoder.java +++ b/soap/src/main/java/feign/soap/SOAPErrorDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/soap/src/test/java/feign/soap/SOAPCodecTest.java b/soap/src/test/java/feign/soap/SOAPCodecTest.java index d9c14c2394..3909161cb5 100644 --- a/soap/src/test/java/feign/soap/SOAPCodecTest.java +++ b/soap/src/test/java/feign/soap/SOAPCodecTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/soap/src/test/java/feign/soap/SOAPFaultDecoderTest.java b/soap/src/test/java/feign/soap/SOAPFaultDecoderTest.java index cb5a20398f..6a5e972c3d 100644 --- a/soap/src/test/java/feign/soap/SOAPFaultDecoderTest.java +++ b/soap/src/test/java/feign/soap/SOAPFaultDecoderTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/soap/src/test/java/feign/soap/package-info.java b/soap/src/test/java/feign/soap/package-info.java index 130465d5a4..f01a870ab2 100644 --- a/soap/src/test/java/feign/soap/package-info.java +++ b/soap/src/test/java/feign/soap/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 The Feign Authors + * Copyright 2012-2023 The Feign Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/spring4/pom.xml b/spring4/pom.xml index e04ab15469..7bb7cc8e3c 100644 --- a/spring4/pom.xml +++ b/spring4/pom.xml @@ -1,7 +1,7 @@