diff --git a/spring-core/src/main/java/org/springframework/core/KotlinDetector.java b/spring-core/src/main/java/org/springframework/core/KotlinDetector.java index b1f35c6d59..b7bd4f0b02 100644 --- a/spring-core/src/main/java/org/springframework/core/KotlinDetector.java +++ b/spring-core/src/main/java/org/springframework/core/KotlinDetector.java @@ -77,14 +77,13 @@ public abstract class KotlinDetector { /** * Return {@code true} if the method is a suspending function. - * * @author Sebastien Deleuze * @since 5.3 */ public static boolean isSuspendingFunction(Method method) { if (KotlinDetector.isKotlinType(method.getDeclaringClass())) { Class[] types = method.getParameterTypes(); - if ((types.length > 0) && "kotlin.coroutines.Continuation".equals(types[types.length - 1].getName())) { + if (types.length > 0 && "kotlin.coroutines.Continuation".equals(types[types.length - 1].getName())) { return true; } } diff --git a/spring-test/src/main/java/org/springframework/test/context/support/ContextLoaderUtils.java b/spring-test/src/main/java/org/springframework/test/context/support/ContextLoaderUtils.java index 75adfd45cb..c35ece1889 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/ContextLoaderUtils.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/ContextLoaderUtils.java @@ -27,6 +27,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.lang.Nullable; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfigurationAttributes; import org.springframework.test.context.ContextHierarchy; @@ -249,11 +250,11 @@ abstract class ContextLoaderUtils { } private static void resolveContextConfigurationAttributes(List attributesList, - AnnotationDescriptor descriptor) { + @Nullable AnnotationDescriptor descriptor) { if (descriptor != null) { convertContextConfigToConfigAttributesAndAddToList(descriptor.synthesizeAnnotation(), - descriptor.getRootDeclaringClass(), attributesList); + descriptor.getRootDeclaringClass(), attributesList); resolveContextConfigurationAttributes(attributesList, descriptor.next()); } } diff --git a/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java index 107f050427..8290bbadfc 100644 --- a/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java @@ -163,6 +163,7 @@ public class TransactionalTestExecutionListener extends AbstractTestExecutionLis return findTransactionAttributeInEnclosingClassHierarchy(clazz); } + @Nullable private TransactionAttribute findTransactionAttributeInEnclosingClassHierarchy(Class clazz) { if (MetaAnnotationUtils.searchEnclosingClass(clazz)) { return findTransactionAttribute(clazz.getEnclosingClass()); diff --git a/spring-test/src/main/java/org/springframework/test/context/web/WebTestContextBootstrapper.java b/spring-test/src/main/java/org/springframework/test/context/web/WebTestContextBootstrapper.java index e6ef700831..3087ca55e9 100644 --- a/spring-test/src/main/java/org/springframework/test/context/web/WebTestContextBootstrapper.java +++ b/spring-test/src/main/java/org/springframework/test/context/web/WebTestContextBootstrapper.java @@ -16,6 +16,7 @@ package org.springframework.test.context.web; +import org.springframework.lang.Nullable; import org.springframework.test.context.ContextLoader; import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.TestContextBootstrapper; @@ -70,6 +71,7 @@ public class WebTestContextBootstrapper extends DefaultTestContextBootstrapper { } } + @Nullable private static WebAppConfiguration getWebAppConfiguration(Class testClass) { return MetaAnnotationUtils.findMergedAnnotation(testClass, WebAppConfiguration.class); } diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java index a5e5c2a756..0d71367f7d 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonDecoder.java @@ -31,6 +31,7 @@ import org.springframework.core.codec.AbstractDecoder; import org.springframework.core.codec.StringDecoder; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.MimeType; @@ -58,6 +59,7 @@ public class KotlinSerializationJsonDecoder extends AbstractDecoder { // String decoding needed for now, see https://github.com/Kotlin/kotlinx.serialization/issues/204 for more details private final StringDecoder stringDecoder = StringDecoder.allMimeTypes(StringDecoder.DEFAULT_DELIMITERS, false); + public KotlinSerializationJsonDecoder() { this(Json.Default); } @@ -67,18 +69,23 @@ public class KotlinSerializationJsonDecoder extends AbstractDecoder { this.json = json; } + @Override - public boolean canDecode(ResolvableType elementType, MimeType mimeType) { - return super.canDecode(elementType, mimeType) && (!CharSequence.class.isAssignableFrom(elementType.toClass())); + public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) { + return (super.canDecode(elementType, mimeType) && !CharSequence.class.isAssignableFrom(elementType.toClass())); } @Override - public Flux decode(Publisher inputStream, ResolvableType elementType, MimeType mimeType, Map hints) { + public Flux decode(Publisher inputStream, ResolvableType elementType, + @Nullable MimeType mimeType, @Nullable Map hints) { + return Flux.error(new UnsupportedOperationException()); } @Override - public Mono decodeToMono(Publisher inputStream, ResolvableType elementType, MimeType mimeType, Map hints) { + public Mono decodeToMono(Publisher inputStream, ResolvableType elementType, + @Nullable MimeType mimeType, @Nullable Map hints) { + return this.stringDecoder .decodeToMono(inputStream, elementType, mimeType, hints) .map(jsonText -> this.json.decodeFromString(serializer(elementType.getType()), jsonText)); @@ -100,4 +107,5 @@ public class KotlinSerializationJsonDecoder extends AbstractDecoder { } return serializer; } + } diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java index 5318257402..f2a619734c 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/KotlinSerializationJsonEncoder.java @@ -34,6 +34,7 @@ import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.http.MediaType; import org.springframework.http.codec.ServerSentEvent; +import org.springframework.lang.Nullable; import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.MimeType; @@ -57,6 +58,7 @@ public class KotlinSerializationJsonEncoder extends AbstractEncoder { // CharSequence encoding needed for now, see https://github.com/Kotlin/kotlinx.serialization/issues/204 for more details private final CharSequenceEncoder charSequenceEncoder = CharSequenceEncoder.allMimeTypes(); + public KotlinSerializationJsonEncoder() { this(Json.Default); } @@ -66,15 +68,17 @@ public class KotlinSerializationJsonEncoder extends AbstractEncoder { this.json = json; } + @Override - public boolean canEncode(ResolvableType elementType, MimeType mimeType) { - return super.canEncode(elementType, mimeType) - && (!String.class.isAssignableFrom(elementType.toClass())) - && (!ServerSentEvent.class.isAssignableFrom(elementType.toClass())); + public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) { + return (super.canEncode(elementType, mimeType) && !String.class.isAssignableFrom(elementType.toClass()) && + !ServerSentEvent.class.isAssignableFrom(elementType.toClass())); } @Override - public Flux encode(Publisher inputStream, DataBufferFactory bufferFactory, ResolvableType elementType, MimeType mimeType, Map hints) { + public Flux encode(Publisher inputStream, DataBufferFactory bufferFactory, + ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map hints) { + if (inputStream instanceof Mono) { return Mono.from(inputStream) .map(value -> encodeValue(value, bufferFactory, elementType, mimeType, hints)) @@ -90,7 +94,9 @@ public class KotlinSerializationJsonEncoder extends AbstractEncoder { } @Override - public DataBuffer encodeValue(Object value, DataBufferFactory bufferFactory, ResolvableType valueType, MimeType mimeType, Map hints) { + public DataBuffer encodeValue(Object value, DataBufferFactory bufferFactory, + ResolvableType valueType, @Nullable MimeType mimeType, @Nullable Map hints) { + String json = this.json.encodeToString(serializer(valueType.getType()), value); return this.charSequenceEncoder.encodeValue(json, bufferFactory, valueType, mimeType, null); } @@ -111,4 +117,5 @@ public class KotlinSerializationJsonEncoder extends AbstractEncoder { } return serializer; } + } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ContinuationHandlerMethodArgumentResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ContinuationHandlerMethodArgumentResolver.java index 82604d6d07..3bd4085988 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ContinuationHandlerMethodArgumentResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ContinuationHandlerMethodArgumentResolver.java @@ -17,6 +17,7 @@ package org.springframework.web.servlet.mvc.method.annotation; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @@ -36,7 +37,10 @@ public class ContinuationHandlerMethodArgumentResolver implements HandlerMethodA } @Override - public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { + return null; } + }