diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java index e29834a02c2..a12caf7ba6f 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java @@ -236,7 +236,9 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter { @Override @Nullable - protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) { + protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers, + @Nullable Object conversionHint) { + try { Class view = getSerializationView(conversionHint); if (byte[].class == getSerializedPayloadClass()) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/MarshallingMessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/MarshallingMessageConverter.java index 74de755ccc1..949f759feaf 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/MarshallingMessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/MarshallingMessageConverter.java @@ -166,7 +166,9 @@ public class MarshallingMessageConverter extends AbstractMessageConverter { @Override @Nullable - protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) { + protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers, + @Nullable Object conversionHint) { + Assert.notNull(this.marshaller, "Property 'marshaller' is required"); try { if (byte[].class == getSerializedPayloadClass()) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java index 082e6b7d8cc..7b5f1fed766 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java @@ -122,12 +122,16 @@ public abstract class AbstractMessageSendingTemplate implements MessageSendin } @Override - public void convertAndSend(D destination, Object payload, @Nullable Map headers) throws MessagingException { + public void convertAndSend(D destination, Object payload, @Nullable Map headers) + throws MessagingException { + convertAndSend(destination, payload, headers, null); } @Override - public void convertAndSend(Object payload, @Nullable MessagePostProcessor postProcessor) throws MessagingException { + public void convertAndSend(Object payload, @Nullable MessagePostProcessor postProcessor) + throws MessagingException { + convertAndSend(getRequiredDefaultDestination(), payload, postProcessor); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/MessageSendingOperations.java b/spring-messaging/src/main/java/org/springframework/messaging/core/MessageSendingOperations.java index 8af26e1dd7e..adee21371e1 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/MessageSendingOperations.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/MessageSendingOperations.java @@ -104,7 +104,7 @@ public interface MessageSendingOperations { * @param headers headers for the message to send * @param postProcessor the post processor to apply to the message */ - void convertAndSend(D destination, Object payload, @Nullable Map headers, @Nullable MessagePostProcessor postProcessor) - throws MessagingException; + void convertAndSend(D destination, Object payload, @Nullable Map headers, + @Nullable MessagePostProcessor postProcessor) throws MessagingException; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/DestinationPatternsMessageCondition.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/DestinationPatternsMessageCondition.java index 3534cafb2ac..c8f529709c1 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/DestinationPatternsMessageCondition.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/DestinationPatternsMessageCondition.java @@ -39,7 +39,8 @@ import org.springframework.util.StringUtils; * @author Rossen Stoyanchev * @since 4.0 */ -public class DestinationPatternsMessageCondition extends AbstractMessageCondition { +public class DestinationPatternsMessageCondition + extends AbstractMessageCondition { public static final String LOOKUP_DESTINATION_HEADER = "lookupDestination"; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java index 90d46dd06d2..dc8e877c589 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java @@ -76,7 +76,9 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * and {@code #{...}} SpEL expressions in default values, or {@code null} if default * values are not expected to contain expressions */ - protected AbstractNamedValueMethodArgumentResolver(ConversionService cs, @Nullable ConfigurableBeanFactory beanFactory) { + protected AbstractNamedValueMethodArgumentResolver(ConversionService cs, + @Nullable ConfigurableBeanFactory beanFactory) { + this.conversionService = (cs != null ? cs : DefaultConversionService.getSharedInstance()); this.configurableBeanFactory = beanFactory; this.expressionContext = (beanFactory != null ? new BeanExpressionContext(beanFactory, null) : null); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DefaultMessageHandlerMethodFactory.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DefaultMessageHandlerMethodFactory.java index 607b6ee7f29..78999c3087f 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DefaultMessageHandlerMethodFactory.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/DefaultMessageHandlerMethodFactory.java @@ -55,7 +55,8 @@ import org.springframework.validation.Validator; * @see #setValidator * @see #setCustomArgumentResolvers */ -public class DefaultMessageHandlerMethodFactory implements MessageHandlerMethodFactory, BeanFactoryAware, InitializingBean { +public class DefaultMessageHandlerMethodFactory + implements MessageHandlerMethodFactory, BeanFactoryAware, InitializingBean { private ConversionService conversionService = new DefaultFormattingConversionService(); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolverComposite.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolverComposite.java index 6a70d1c34a3..5df4d895d65 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolverComposite.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolverComposite.java @@ -68,7 +68,9 @@ public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgu /** * Add the given {@link HandlerMethodArgumentResolver}s. */ - public HandlerMethodArgumentResolverComposite addResolvers(@Nullable List argumentResolvers) { + public HandlerMethodArgumentResolverComposite addResolvers( + @Nullable List argumentResolvers) { + if (argumentResolvers != null) { for (HandlerMethodArgumentResolver resolver : argumentResolvers) { this.argumentResolvers.add(resolver); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributes.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributes.java index b2f4e97e3a4..29bc4d1175d 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributes.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributes.java @@ -43,7 +43,8 @@ public class SimpAttributes { public static final String SESSION_COMPLETED_NAME = SimpAttributes.class.getName() + ".COMPLETED"; /** Prefix for the name of session attributes used to store destruction callbacks. */ - public static final String DESTRUCTION_CALLBACK_NAME_PREFIX = SimpAttributes.class.getName() + ".DESTRUCTION_CALLBACK."; + public static final String DESTRUCTION_CALLBACK_NAME_PREFIX = + SimpAttributes.class.getName() + ".DESTRUCTION_CALLBACK."; private static final Log logger = LogFactory.getLog(SimpAttributes.class); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java index ad63adeee45..abb71aaa9d0 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java @@ -88,7 +88,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { * A constructor for creating new message headers. * This constructor is protected. See factory methods in this and sub-classes. */ - protected SimpMessageHeaderAccessor(SimpMessageType messageType, @Nullable Map> externalSourceHeaders) { + protected SimpMessageHeaderAccessor(SimpMessageType messageType, + @Nullable Map> externalSourceHeaders) { + super(externalSourceHeaders); Assert.notNull(messageType, "MessageType must not be null"); setHeader(MESSAGE_TYPE_HEADER, messageType); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessagingTemplate.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessagingTemplate.java index 9b2b8567866..c4b0ae61ffe 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessagingTemplate.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessagingTemplate.java @@ -231,7 +231,7 @@ public class SimpMessagingTemplate extends AbstractMessageSendingTemplateHowever if the given headers already contain the key diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java index fc75d12ba57..97f97c586a5 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java @@ -433,7 +433,9 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { @Nullable public Subscription getSubscription(String subscriptionId) { - for (Map.Entry> destinationEntry : this.destinationLookup.entrySet()) { + for (Map.Entry> destinationEntry : + this.destinationLookup.entrySet()) { + Set subs = destinationEntry.getValue(); if (subs != null) { for (Subscription sub : subs) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java index 2f839fee5c9..5ae43cbbde2 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java @@ -106,7 +106,9 @@ public class StompDecoder { * @return the decoded messages, or an empty list if none * @throws StompConversionException raised in case of decoding issues */ - public List> decode(ByteBuffer byteBuffer, @Nullable MultiValueMap partialMessageHeaders) { + public List> decode(ByteBuffer byteBuffer, + @Nullable MultiValueMap partialMessageHeaders) { + List> messages = new ArrayList<>(); while (byteBuffer.hasRemaining()) { Message message = decodeMessage(byteBuffer, partialMessageHeaders); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java b/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java index a0748f3ab56..ef325add9f0 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java @@ -179,7 +179,9 @@ public abstract class AbstractMessageChannel implements MessageChannel, Intercep } } - public void triggerAfterSendCompletion(Message message, MessageChannel channel, boolean sent, @Nullable Exception ex) { + public void triggerAfterSendCompletion(Message message, MessageChannel channel, + boolean sent, @Nullable Exception ex) { + for (int i = this.sendInterceptorIndex; i >= 0; i--) { ChannelInterceptor interceptor = interceptors.get(i); try { diff --git a/spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java b/spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java index aabf7e5f252..8986f3dcab3 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/converter/MappingJackson2MessageConverterTests.java @@ -47,8 +47,10 @@ public class MappingJackson2MessageConverterTests { @Test public void defaultConstructor() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); - assertThat(converter.getSupportedMimeTypes(), contains(new MimeType("application", "json", StandardCharsets.UTF_8))); - assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); + assertThat(converter.getSupportedMimeTypes(), + contains(new MimeType("application", "json", StandardCharsets.UTF_8))); + assertFalse(converter.getObjectMapper().getDeserializationConfig() + .isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); } @Test // SPR-12724 @@ -56,7 +58,8 @@ public class MappingJackson2MessageConverterTests { MimeType mimetype = new MimeType("application", "xml", StandardCharsets.UTF_8); MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(mimetype); assertThat(converter.getSupportedMimeTypes(), contains(mimetype)); - assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); + assertFalse(converter.getObjectMapper().getDeserializationConfig() + .isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); } @Test // SPR-12724 @@ -65,13 +68,20 @@ public class MappingJackson2MessageConverterTests { MimeType xmlMimetype = new MimeType("application", "xml", StandardCharsets.UTF_8); MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(jsonMimetype, xmlMimetype); assertThat(converter.getSupportedMimeTypes(), contains(jsonMimetype, xmlMimetype)); - assertFalse(converter.getObjectMapper().getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); + assertFalse(converter.getObjectMapper().getDeserializationConfig() + .isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); } @Test public void fromMessage() throws Exception { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); - String payload = "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}"; + String payload = "{" + + "\"bytes\":\"AQI=\"," + + "\"array\":[\"Foo\",\"Bar\"]," + + "\"number\":42," + + "\"string\":\"Foo\"," + + "\"bool\":true," + + "\"fraction\":42.0}"; Message message = MessageBuilder.withPayload(payload.getBytes(StandardCharsets.UTF_8)).build(); MyBean actual = (MyBean) converter.fromMessage(message, MyBean.class); diff --git a/spring-messaging/src/test/java/org/springframework/messaging/converter/MessageConverterTests.java b/spring-messaging/src/test/java/org/springframework/messaging/converter/MessageConverterTests.java index 10e2940f470..c30f651edaa 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/converter/MessageConverterTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/converter/MessageConverterTests.java @@ -157,12 +157,16 @@ public class MessageConverterTests { } @Override - protected Object convertFromInternal(Message message, Class targetClass, @Nullable Object conversionHint) { + protected Object convertFromInternal(Message message, Class targetClass, + @Nullable Object conversionHint) { + return "success-from"; } @Override - protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) { + protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers, + @Nullable Object conversionHint) { + return "success-to"; } } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/core/CachingDestinationResolverTests.java b/spring-messaging/src/test/java/org/springframework/messaging/core/CachingDestinationResolverTests.java index 7749f2e6754..4397a30bff8 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/core/CachingDestinationResolverTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/core/CachingDestinationResolverTests.java @@ -32,25 +32,25 @@ public class CachingDestinationResolverTests { @Test public void cachedDestination() { @SuppressWarnings("unchecked") - DestinationResolver destinationResolver = mock(DestinationResolver.class); - CachingDestinationResolverProxy cachingDestinationResolver = new CachingDestinationResolverProxy<>(destinationResolver); + DestinationResolver resolver = mock(DestinationResolver.class); + CachingDestinationResolverProxy resolverProxy = new CachingDestinationResolverProxy<>(resolver); - given(destinationResolver.resolveDestination("abcd")).willReturn("dcba"); - given(destinationResolver.resolveDestination("1234")).willReturn("4321"); + given(resolver.resolveDestination("abcd")).willReturn("dcba"); + given(resolver.resolveDestination("1234")).willReturn("4321"); - assertEquals("dcba", cachingDestinationResolver.resolveDestination("abcd")); - assertEquals("4321", cachingDestinationResolver.resolveDestination("1234")); - assertEquals("4321", cachingDestinationResolver.resolveDestination("1234")); - assertEquals("dcba", cachingDestinationResolver.resolveDestination("abcd")); + assertEquals("dcba", resolverProxy.resolveDestination("abcd")); + assertEquals("4321", resolverProxy.resolveDestination("1234")); + assertEquals("4321", resolverProxy.resolveDestination("1234")); + assertEquals("dcba", resolverProxy.resolveDestination("abcd")); - verify(destinationResolver, times(1)).resolveDestination("abcd"); - verify(destinationResolver, times(1)).resolveDestination("1234"); + verify(resolver, times(1)).resolveDestination("abcd"); + verify(resolver, times(1)).resolveDestination("1234"); } @Test(expected = IllegalArgumentException.class) public void noTargetSet() { - CachingDestinationResolverProxy cachingDestinationResolver = new CachingDestinationResolverProxy<>(); - cachingDestinationResolver.afterPropertiesSet(); + CachingDestinationResolverProxy resolverProxy = new CachingDestinationResolverProxy<>(); + resolverProxy.afterPropertiesSet(); } @Test(expected = IllegalArgumentException.class) diff --git a/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/AnnotationExceptionHandlerMethodResolverTests.java b/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/AnnotationExceptionHandlerMethodResolverTests.java index e28577c875d..0835348893f 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/AnnotationExceptionHandlerMethodResolverTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/AnnotationExceptionHandlerMethodResolverTests.java @@ -37,56 +37,53 @@ import static org.junit.Assert.*; */ public class AnnotationExceptionHandlerMethodResolverTests { + private final AnnotationExceptionHandlerMethodResolver resolver = + new AnnotationExceptionHandlerMethodResolver(ExceptionController.class); + + @Test public void resolveMethodFromAnnotation() { - AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(ExceptionController.class); IOException exception = new IOException(); - assertEquals("handleIOException", resolver.resolveMethod(exception).getName()); + assertEquals("handleIOException", this.resolver.resolveMethod(exception).getName()); } @Test public void resolveMethodFromArgument() { - AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(ExceptionController.class); IllegalArgumentException exception = new IllegalArgumentException(); - assertEquals("handleIllegalArgumentException", resolver.resolveMethod(exception).getName()); + assertEquals("handleIllegalArgumentException", this.resolver.resolveMethod(exception).getName()); } @Test public void resolveMethodFromArgumentWithErrorType() { - AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(ExceptionController.class); AssertionError exception = new AssertionError(); - assertEquals("handleAssertionError", resolver.resolveMethod(new IllegalStateException(exception)).getName()); + assertEquals("handleAssertionError", this.resolver.resolveMethod(new IllegalStateException(exception)).getName()); } @Test public void resolveMethodExceptionSubType() { - AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(ExceptionController.class); IOException ioException = new FileNotFoundException(); - assertEquals("handleIOException", resolver.resolveMethod(ioException).getName()); + assertEquals("handleIOException", this.resolver.resolveMethod(ioException).getName()); SocketException bindException = new BindException(); - assertEquals("handleSocketException", resolver.resolveMethod(bindException).getName()); + assertEquals("handleSocketException", this.resolver.resolveMethod(bindException).getName()); } @Test public void resolveMethodBestMatch() { - AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(ExceptionController.class); SocketException exception = new SocketException(); - assertEquals("handleSocketException", resolver.resolveMethod(exception).getName()); + assertEquals("handleSocketException", this.resolver.resolveMethod(exception).getName()); } @Test public void resolveMethodNoMatch() { - AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(ExceptionController.class); Exception exception = new Exception(); - assertNull("1st lookup", resolver.resolveMethod(exception)); - assertNull("2nd lookup from cache", resolver.resolveMethod(exception)); + assertNull("1st lookup", this.resolver.resolveMethod(exception)); + assertNull("2nd lookup from cache", this.resolver.resolveMethod(exception)); } @Test public void resolveMethodInherited() { - AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(InheritedController.class); IOException exception = new IOException(); - assertEquals("handleIOException", resolver.resolveMethod(exception).getName()); + assertEquals("handleIOException", this.resolver.resolveMethod(exception).getName()); } @Test(expected = IllegalStateException.class) @@ -101,6 +98,7 @@ public class AnnotationExceptionHandlerMethodResolverTests { @Controller + @SuppressWarnings("unused") static class ExceptionController { public void handle() {} diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/SimpMessageTypeMessageConditionTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/SimpMessageTypeMessageConditionTests.java index 5e24c85d441..3f7792961fb 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/SimpMessageTypeMessageConditionTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/SimpMessageTypeMessageConditionTests.java @@ -32,14 +32,17 @@ public class SimpMessageTypeMessageConditionTests { @Test public void combine() { - SimpMessageType actual = condition(SimpMessageType.MESSAGE).combine(condition(SimpMessageType.SUBSCRIBE)).getMessageType(); - assertEquals(SimpMessageType.SUBSCRIBE, actual); + SimpMessageType messageType = SimpMessageType.MESSAGE; + SimpMessageType subscribeType = SimpMessageType.SUBSCRIBE; - actual = condition(SimpMessageType.MESSAGE).combine(condition(SimpMessageType.MESSAGE)).getMessageType(); - assertEquals(SimpMessageType.MESSAGE, actual); + SimpMessageType actual = condition(messageType).combine(condition(subscribeType)).getMessageType(); + assertEquals(subscribeType, actual); - actual = condition(SimpMessageType.SUBSCRIBE).combine(condition(SimpMessageType.SUBSCRIBE)).getMessageType(); - assertEquals(SimpMessageType.SUBSCRIBE, actual); + actual = condition(messageType).combine(condition(messageType)).getMessageType(); + assertEquals(messageType, actual); + + actual = condition(subscribeType).combine(condition(subscribeType)).getMessageType(); + assertEquals(subscribeType, actual); } @Test diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java index 77a0b7265e6..cecfafca662 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java @@ -67,6 +67,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Controller; import org.springframework.util.AntPathMatcher; import org.springframework.util.MimeTypeUtils; +import org.springframework.util.PathMatcher; import org.springframework.validation.Errors; import org.springframework.validation.Validator; import org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean; @@ -132,7 +133,8 @@ public class MessageBrokerConfigurationTests { @Test public void clientOutboundChannelUsedByAnnotatedMethod() { TestChannel channel = this.simpleBrokerContext.getBean("clientOutboundChannel", TestChannel.class); - SimpAnnotationMethodMessageHandler messageHandler = this.simpleBrokerContext.getBean(SimpAnnotationMethodMessageHandler.class); + SimpAnnotationMethodMessageHandler messageHandler = + this.simpleBrokerContext.getBean(SimpAnnotationMethodMessageHandler.class); StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.SUBSCRIBE); headers.setSessionId("sess1"); @@ -327,7 +329,8 @@ public class MessageBrokerConfigurationTests { @Test public void customArgumentAndReturnValueTypes() throws Exception { - SimpAnnotationMethodMessageHandler handler = this.customContext.getBean(SimpAnnotationMethodMessageHandler.class); + SimpAnnotationMethodMessageHandler handler = + this.customContext.getBean(SimpAnnotationMethodMessageHandler.class); List customResolvers = handler.getCustomArgumentResolvers(); assertEquals(1, customResolvers.size()); @@ -385,8 +388,10 @@ public class MessageBrokerConfigurationTests { DefaultSubscriptionRegistry registry = (DefaultSubscriptionRegistry) broker.getSubscriptionRegistry(); assertEquals("a.a", registry.getPathMatcher().combine("a", "a")); - SimpAnnotationMethodMessageHandler handler = this.customContext.getBean(SimpAnnotationMethodMessageHandler.class); - assertEquals("a.a", handler.getPathMatcher().combine("a", "a")); + PathMatcher pathMatcher = + this.customContext.getBean(SimpAnnotationMethodMessageHandler.class).getPathMatcher(); + + assertEquals("a.a", pathMatcher.combine("a", "a")); DefaultUserDestinationResolver resolver = this.customContext.getBean(DefaultUserDestinationResolver.class); assertNotNull(resolver); @@ -536,7 +541,8 @@ public class MessageBrokerConfigurationTests { @Override protected void configureMessageBroker(MessageBrokerRegistry registry) { registry.configureBrokerChannel().interceptors(this.interceptor, this.interceptor, this.interceptor); - registry.configureBrokerChannel().taskExecutor().corePoolSize(31).maxPoolSize(32).keepAliveSeconds(33).queueCapacity(34); + registry.configureBrokerChannel().taskExecutor() + .corePoolSize(31).maxPoolSize(32).keepAliveSeconds(33).queueCapacity(34); registry.setPathMatcher(new AntPathMatcher(".")).enableSimpleBroker("/topic", "/queue"); registry.setCacheLimit(8192); } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/DefaultStompSessionTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/DefaultStompSessionTests.java index 44bfea5a00e..700b82fde2f 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/DefaultStompSessionTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/DefaultStompSessionTests.java @@ -217,7 +217,8 @@ public class DefaultStompSessionTests { StompHeaders stompHeaders = StompHeaders.readOnlyStompHeaders(accessor.getNativeHeaders()); when(this.sessionHandler.getPayloadType(stompHeaders)).thenReturn(String.class); - this.session.handleMessage(MessageBuilder.createMessage(payload.getBytes(StandardCharsets.UTF_8), accessor.getMessageHeaders())); + this.session.handleMessage(MessageBuilder.createMessage( + payload.getBytes(StandardCharsets.UTF_8), accessor.getMessageHeaders())); verify(this.sessionHandler).getPayloadType(stompHeaders); verify(this.sessionHandler).handleFrame(stompHeaders, payload); diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandlerIntegrationTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandlerIntegrationTests.java index 2fa8335ae0a..07ca65d480f 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandlerIntegrationTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandlerIntegrationTests.java @@ -49,7 +49,9 @@ import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.Assert; import org.springframework.util.SocketUtils; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; /** * Integration tests for {@link StompBrokerRelayMessageHandler} running against ActiveMQ. @@ -509,7 +511,9 @@ public class StompBrokerRelayMessageHandlerIntegrationTests { @Override protected boolean matchInternal(StompHeaderAccessor headers, Object payload) { - if (!this.subscriptionId.equals(headers.getSubscriptionId()) || !this.destination.equals(headers.getDestination())) { + if (!this.subscriptionId.equals(headers.getSubscriptionId()) || + !this.destination.equals(headers.getDestination())) { + return false; } if (payload instanceof byte[] && this.payload instanceof byte[]) { diff --git a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java index d9ec3f52b71..7cc729e3296 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java @@ -31,8 +31,15 @@ import org.springframework.messaging.MessageHeaders; import org.springframework.util.MimeTypeUtils; import org.springframework.util.SerializationTestUtils; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; /** * Test fixture for {@link MessageHeaderAccessor}. @@ -314,9 +321,10 @@ public class MessageHeaderAccessorTests { MessageHeaderAccessor accessor = new MessageHeaderAccessor(); accessor.setContentType(MimeTypeUtils.TEXT_PLAIN); - assertEquals("headers={contentType=text/plain} payload=p", accessor.getShortLogMessage("p")); - assertEquals("headers={contentType=text/plain} payload=p", accessor.getShortLogMessage("p".getBytes(StandardCharsets.UTF_8))); - assertEquals("headers={contentType=text/plain} payload=p", accessor.getShortLogMessage(new Object() { + String expected = "headers={contentType=text/plain} payload=p"; + assertEquals(expected, accessor.getShortLogMessage("p")); + assertEquals(expected, accessor.getShortLogMessage("p".getBytes(StandardCharsets.UTF_8))); + assertEquals(expected, accessor.getShortLogMessage(new Object() { @Override public String toString() { return "p"; @@ -349,9 +357,10 @@ public class MessageHeaderAccessorTests { MessageHeaderAccessor accessor = new MessageHeaderAccessor(); accessor.setContentType(MimeTypeUtils.TEXT_PLAIN); - assertEquals("headers={contentType=text/plain} payload=p", accessor.getDetailedLogMessage("p")); - assertEquals("headers={contentType=text/plain} payload=p", accessor.getDetailedLogMessage("p".getBytes(StandardCharsets.UTF_8))); - assertEquals("headers={contentType=text/plain} payload=p", accessor.getDetailedLogMessage(new Object() { + String expected = "headers={contentType=text/plain} payload=p"; + assertEquals(expected, accessor.getDetailedLogMessage("p")); + assertEquals(expected, accessor.getDetailedLogMessage("p".getBytes(StandardCharsets.UTF_8))); + assertEquals(expected, accessor.getDetailedLogMessage(new Object() { @Override public String toString() { return "p"; diff --git a/spring-web/src/main/java/org/springframework/http/HttpStatus.java b/spring-web/src/main/java/org/springframework/http/HttpStatus.java index 4cf7b7d6672..e7b0f4aec5b 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpStatus.java +++ b/spring-web/src/main/java/org/springframework/http/HttpStatus.java @@ -216,36 +216,42 @@ public enum HttpStatus { CONFLICT(409, "Conflict"), /** * {@code 410 Gone}. - * @see HTTP/1.1: Semantics and Content, section 6.5.9 + * @see + * HTTP/1.1: Semantics and Content, section 6.5.9 */ GONE(410, "Gone"), /** * {@code 411 Length Required}. - * @see HTTP/1.1: Semantics and Content, section 6.5.10 + * @see + * HTTP/1.1: Semantics and Content, section 6.5.10 */ LENGTH_REQUIRED(411, "Length Required"), /** * {@code 412 Precondition failed}. - * @see HTTP/1.1: Conditional Requests, section 4.2 + * @see + * HTTP/1.1: Conditional Requests, section 4.2 */ PRECONDITION_FAILED(412, "Precondition Failed"), /** * {@code 413 Payload Too Large}. * @since 4.1 - * @see HTTP/1.1: Semantics and Content, section 6.5.11 + * @see + * HTTP/1.1: Semantics and Content, section 6.5.11 */ PAYLOAD_TOO_LARGE(413, "Payload Too Large"), /** * {@code 413 Request Entity Too Large}. * @see HTTP/1.1, section 10.4.14 - * @deprecated in favor of {@link #PAYLOAD_TOO_LARGE} which will be returned from {@code HttpStatus.valueOf(413)} + * @deprecated in favor of {@link #PAYLOAD_TOO_LARGE} which will be + * returned from {@code HttpStatus.valueOf(413)} */ @Deprecated REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"), /** * {@code 414 URI Too Long}. * @since 4.1 - * @see HTTP/1.1: Semantics and Content, section 6.5.12 + * @see + * HTTP/1.1: Semantics and Content, section 6.5.12 */ URI_TOO_LONG(414, "URI Too Long"), /** @@ -257,7 +263,8 @@ public enum HttpStatus { REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"), /** * {@code 415 Unsupported Media Type}. - * @see HTTP/1.1: Semantics and Content, section 6.5.13 + * @see + * HTTP/1.1: Semantics and Content, section 6.5.13 */ UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"), /** @@ -267,7 +274,8 @@ public enum HttpStatus { REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested range not satisfiable"), /** * {@code 417 Expectation Failed}. - * @see HTTP/1.1: Semantics and Content, section 6.5.14 + * @see + * HTTP/1.1: Semantics and Content, section 6.5.14 */ EXPECTATION_FAILED(417, "Expectation Failed"), /** @@ -276,17 +284,23 @@ public enum HttpStatus { */ I_AM_A_TEAPOT(418, "I'm a teapot"), /** - * @deprecated See WebDAV Draft Changes + * @deprecated See + * + * WebDAV Draft Changes */ @Deprecated INSUFFICIENT_SPACE_ON_RESOURCE(419, "Insufficient Space On Resource"), /** - * @deprecated See WebDAV Draft Changes + * @deprecated See + * + * WebDAV Draft Changes */ @Deprecated METHOD_FAILURE(420, "Method Failure"), /** - * @deprecated See WebDAV Draft Changes + * @deprecated + * See + * WebDAV Draft Changes */ @Deprecated DESTINATION_LOCKED(421, "Destination Locked"), diff --git a/spring-web/src/main/java/org/springframework/http/MediaType.java b/spring-web/src/main/java/org/springframework/http/MediaType.java index ca3c7058134..ca5421a71c0 100644 --- a/spring-web/src/main/java/org/springframework/http/MediaType.java +++ b/spring-web/src/main/java/org/springframework/http/MediaType.java @@ -45,7 +45,8 @@ import org.springframework.util.StringUtils; * @author Sebastien Deleuze * @author Kazuki Shimizu * @since 3.0 - * @see HTTP 1.1: Semantics and Content, section 3.1.1.1 + * @see + * HTTP 1.1: Semantics and Content, section 3.1.1.1 */ public class MediaType extends MimeType implements Serializable { @@ -699,7 +700,8 @@ public class MediaType extends MimeType implements Serializable { else { int paramsSize1 = mediaType1.getParameters().size(); int paramsSize2 = mediaType2.getParameters().size(); - return (paramsSize2 < paramsSize1 ? -1 : (paramsSize2 == paramsSize1 ? 0 : 1)); // audio/basic;level=1 < audio/basic + // audio/basic;level=1 < audio/basic + return (paramsSize2 < paramsSize1 ? -1 : (paramsSize2 == paramsSize1 ? 0 : 1)); } } }; diff --git a/spring-web/src/main/java/org/springframework/http/RequestEntity.java b/spring-web/src/main/java/org/springframework/http/RequestEntity.java index 8fcd40a54c1..f4718ae7142 100644 --- a/spring-web/src/main/java/org/springframework/http/RequestEntity.java +++ b/spring-web/src/main/java/org/springframework/http/RequestEntity.java @@ -33,7 +33,10 @@ import org.springframework.util.ObjectUtils; * {@link org.springframework.web.client.RestTemplate#exchange(RequestEntity, Class) exchange()}: *
  * MyRequest body = ...
- * RequestEntity<MyRequest> request = RequestEntity.post(new URI("http://example.com/bar")).accept(MediaType.APPLICATION_JSON).body(body);
+ * RequestEntity<MyRequest> request = RequestEntity
+ *     .post(new URI("http://example.com/bar"))
+ *     .accept(MediaType.APPLICATION_JSON)
+ *     .body(body);
  * ResponseEntity<MyResponse> response = template.exchange(request, MyResponse.class);
  * 
* diff --git a/spring-web/src/main/java/org/springframework/http/client/AsyncClientHttpRequestExecution.java b/spring-web/src/main/java/org/springframework/http/client/AsyncClientHttpRequestExecution.java index 232df59ec82..f9b7e068a22 100644 --- a/spring-web/src/main/java/org/springframework/http/client/AsyncClientHttpRequestExecution.java +++ b/spring-web/src/main/java/org/springframework/http/client/AsyncClientHttpRequestExecution.java @@ -31,7 +31,8 @@ import org.springframework.util.concurrent.ListenableFuture; * @author Rossen Stoyanchev * @since 4.3 * @see AsyncClientHttpRequestInterceptor - * @deprecated as of Spring 5.0, in favor of {@link org.springframework.web.reactive.function.client.ExchangeFilterFunction} + * @deprecated as of Spring 5.0, in favor of + * {@link org.springframework.web.reactive.function.client.ExchangeFilterFunction} */ @Deprecated public interface AsyncClientHttpRequestExecution { diff --git a/spring-web/src/main/java/org/springframework/http/client/AsyncClientHttpRequestInterceptor.java b/spring-web/src/main/java/org/springframework/http/client/AsyncClientHttpRequestInterceptor.java index 6b7a0cd892d..b6f7825a93e 100644 --- a/spring-web/src/main/java/org/springframework/http/client/AsyncClientHttpRequestInterceptor.java +++ b/spring-web/src/main/java/org/springframework/http/client/AsyncClientHttpRequestInterceptor.java @@ -36,7 +36,8 @@ import org.springframework.util.concurrent.ListenableFuture; * @since 4.3 * @see org.springframework.web.client.AsyncRestTemplate * @see org.springframework.http.client.support.InterceptingAsyncHttpAccessor - * @deprecated as of Spring 5.0, in favor of {@link org.springframework.web.reactive.function.client.ExchangeFilterFunction} + * @deprecated as of Spring 5.0, in favor of + * {@link org.springframework.web.reactive.function.client.ExchangeFilterFunction} */ @Deprecated public interface AsyncClientHttpRequestInterceptor { diff --git a/spring-web/src/main/java/org/springframework/http/client/ClientHttpRequestInterceptor.java b/spring-web/src/main/java/org/springframework/http/client/ClientHttpRequestInterceptor.java index 4788d879d81..81e2d618bb2 100644 --- a/spring-web/src/main/java/org/springframework/http/client/ClientHttpRequestInterceptor.java +++ b/spring-web/src/main/java/org/springframework/http/client/ClientHttpRequestInterceptor.java @@ -21,12 +21,14 @@ import java.io.IOException; import org.springframework.http.HttpRequest; /** - * Intercepts client-side HTTP requests. Implementations of this interface can be {@linkplain - * org.springframework.web.client.RestTemplate#setInterceptors(java.util.List) registered} with the - * {@link org.springframework.web.client.RestTemplate RestTemplate}, as to modify the outgoing {@link ClientHttpRequest} - * and/or the incoming {@link ClientHttpResponse}. + * Intercepts client-side HTTP requests. Implementations of this interface can be + * {@linkplain org.springframework.web.client.RestTemplate#setInterceptors(java.util.List) + * registered} with the {@link org.springframework.web.client.RestTemplate RestTemplate}, + * as to modify the outgoing {@link ClientHttpRequest} and/or the incoming + * {@link ClientHttpResponse}. * - *

The main entry point for interceptors is {@link #intercept(HttpRequest, byte[], ClientHttpRequestExecution)}. + *

The main entry point for interceptors is + * {@link #intercept(HttpRequest, byte[], ClientHttpRequestExecution)}. * * @author Arjen Poutsma * @since 3.1 @@ -35,17 +37,20 @@ import org.springframework.http.HttpRequest; public interface ClientHttpRequestInterceptor { /** - * Intercept the given request, and return a response. The given {@link ClientHttpRequestExecution} allows - * the interceptor to pass on the request and response to the next entity in the chain. + * Intercept the given request, and return a response. The given + * {@link ClientHttpRequestExecution} allows the interceptor to pass on the + * request and response to the next entity in the chain. * *

A typical implementation of this method would follow the following pattern: *

    *
  1. Examine the {@linkplain HttpRequest request} and body
  2. - *
  3. Optionally {@linkplain org.springframework.http.client.support.HttpRequestWrapper wrap} the request to filter HTTP attributes.
  4. + *
  5. Optionally {@linkplain org.springframework.http.client.support.HttpRequestWrapper + * wrap} the request to filter HTTP attributes.
  6. *
  7. Optionally modify the body of the request.
  8. *
  9. Either *
      - *
    • execute the request using {@link ClientHttpRequestExecution#execute(org.springframework.http.HttpRequest, byte[])},
    • + *
    • execute the request using + * {@link ClientHttpRequestExecution#execute(org.springframework.http.HttpRequest, byte[])},
    • * or *
    • do not execute the request to block the execution altogether.
    • *
    diff --git a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsAsyncClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsAsyncClientHttpRequest.java index 1e3a7c41124..1e3daab86f9 100644 --- a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsAsyncClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsAsyncClientHttpRequest.java @@ -160,7 +160,9 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC } @Override - public void addCallback(SuccessCallback successCallback, FailureCallback failureCallback) { + public void addCallback(SuccessCallback successCallback, + FailureCallback failureCallback) { + this.callback.addSuccessCallback(successCallback); this.callback.addFailureCallback(failureCallback); } diff --git a/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpRequest.java index 3669d2bf4ed..1d722a1ad48 100644 --- a/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpRequest.java @@ -50,7 +50,8 @@ import org.springframework.util.concurrent.SettableListenableFuture; * @author Rossen Stoyanchev * @author Brian Clozel * @since 4.1.2 - * @deprecated as of Spring 5.0, in favor of {@link org.springframework.http.client.reactive.ReactorClientHttpConnector} + * @deprecated as of Spring 5.0, in favor of + * {@link org.springframework.http.client.reactive.ReactorClientHttpConnector} */ @Deprecated class Netty4ClientHttpRequest extends AbstractAsyncClientHttpRequest implements ClientHttpRequest { diff --git a/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpRequestFactory.java index 399d5b86640..fa8df646404 100644 --- a/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpRequestFactory.java @@ -57,7 +57,8 @@ import org.springframework.util.Assert; * @author Brian Clozel * @author Mark Paluch * @since 4.1.2 - * @deprecated as of Spring 5.0, in favor of {@link org.springframework.http.client.reactive.ReactorClientHttpConnector} + * @deprecated as of Spring 5.0, in favor of + * {@link org.springframework.http.client.reactive.ReactorClientHttpConnector} */ @Deprecated public class Netty4ClientHttpRequestFactory implements ClientHttpRequestFactory, diff --git a/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpResponse.java b/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpResponse.java index 6556c47c3a2..827fa736772 100644 --- a/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/client/Netty4ClientHttpResponse.java @@ -33,7 +33,8 @@ import org.springframework.util.Assert; * * @author Arjen Poutsma * @since 4.1.2 - * @deprecated as of Spring 5.0, in favor of {@link org.springframework.http.client.reactive.ReactorClientHttpConnector} + * @deprecated as of Spring 5.0, in favor of + * {@link org.springframework.http.client.reactive.ReactorClientHttpConnector} */ @Deprecated class Netty4ClientHttpResponse extends AbstractClientHttpResponse { diff --git a/spring-web/src/main/java/org/springframework/http/client/support/AsyncHttpAccessor.java b/spring-web/src/main/java/org/springframework/http/client/support/AsyncHttpAccessor.java index ab850ec9784..63239d1ef58 100644 --- a/spring-web/src/main/java/org/springframework/http/client/support/AsyncHttpAccessor.java +++ b/spring-web/src/main/java/org/springframework/http/client/support/AsyncHttpAccessor.java @@ -54,7 +54,9 @@ public class AsyncHttpAccessor { * Set the request factory that this accessor uses for obtaining {@link * org.springframework.http.client.ClientHttpRequest HttpRequests}. */ - public void setAsyncRequestFactory(org.springframework.http.client.AsyncClientHttpRequestFactory asyncRequestFactory) { + public void setAsyncRequestFactory( + org.springframework.http.client.AsyncClientHttpRequestFactory asyncRequestFactory) { + Assert.notNull(asyncRequestFactory, "AsyncClientHttpRequestFactory must not be null"); this.asyncRequestFactory = asyncRequestFactory; } diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java index 1cc34f93af7..9ff6fae0ca7 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java @@ -99,7 +99,7 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple return Flux.from(inputStream).map(value -> encodeValue(value, mimeType, bufferFactory, elementType, hints)); } - else if (this.streamingMediaTypes.stream().anyMatch(streamingMediaType -> streamingMediaType.isCompatibleWith(mimeType))) { + else if (this.streamingMediaTypes.stream().anyMatch(mediaType -> mediaType.isCompatibleWith(mimeType))) { return Flux.from(inputStream).map(value -> { DataBuffer buffer = encodeValue(value, mimeType, bufferFactory, elementType, hints); buffer.write(new byte[]{'\n'}); diff --git a/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java index c80be39a94a..ea321160c1a 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java @@ -79,8 +79,8 @@ public abstract class AbstractGenericHttpMessageConverter extends AbstractHtt * This implementation sets the default headers by calling {@link #addDefaultHeaders}, * and then calls {@link #writeInternal}. */ - public final void write(final T t, @Nullable final Type type, @Nullable MediaType contentType, HttpOutputMessage outputMessage) - throws IOException, HttpMessageNotWritableException { + public final void write(final T t, @Nullable final Type type, @Nullable MediaType contentType, + HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { final HttpHeaders headers = outputMessage.getHeaders(); addDefaultHeaders(headers, t, contentType); diff --git a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java index c9a7589f628..5b09fb3ba88 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java @@ -332,7 +332,9 @@ public class FormHttpMessageConverter implements HttpMessageConverter parts, HttpOutputMessage outputMessage) throws IOException { + private void writeMultipart(final MultiValueMap parts, + HttpOutputMessage outputMessage) throws IOException { + final byte[] boundary = generateMultipartBoundary(); Map parameters = new HashMap<>(2); parameters.put("boundary", new String(boundary, "US-ASCII")); diff --git a/spring-web/src/main/java/org/springframework/http/converter/feed/AbstractWireFeedHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/feed/AbstractWireFeedHttpMessageConverter.java index 2a6426524af..2ac318e389c 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/feed/AbstractWireFeedHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/feed/AbstractWireFeedHttpMessageConverter.java @@ -49,7 +49,8 @@ import org.springframework.util.StringUtils; * @see AtomFeedHttpMessageConverter * @see RssChannelHttpMessageConverter */ -public abstract class AbstractWireFeedHttpMessageConverter extends AbstractHttpMessageConverter { +public abstract class AbstractWireFeedHttpMessageConverter + extends AbstractHttpMessageConverter { public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java index ac96f637645..e6110c54405 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java @@ -76,10 +76,14 @@ import org.springframework.util.xml.StaxUtils; *

    It also automatically registers the following well-known modules if they are * detected on the classpath: *

    * *

    Compatible with Jackson 2.6 and higher, as of Spring 4.3. @@ -766,11 +770,13 @@ public class Jackson2ObjectMapperBuilder { if (KotlinDetector.isKotlinPresent()) { try { Class kotlinModule = (Class) - ClassUtils.forName("com.fasterxml.jackson.module.kotlin.KotlinModule", this.moduleClassLoader); + ClassUtils.forName("com.fasterxml.jackson.module.kotlin.KotlinModule", + this.moduleClassLoader); objectMapper.registerModule(BeanUtils.instantiateClass(kotlinModule)); } catch (ClassNotFoundException ex) { - logger.warn("For Jackson Kotlin classes support please add \"com.fasterxml.jackson.module:jackson-module-kotlin\" to the classpath"); + logger.warn("For Jackson Kotlin classes support please add " + + "\"com.fasterxml.jackson.module:jackson-module-kotlin\" to the classpath"); } } } diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.java b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.java index 7396b933afe..0c6dc517be3 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.java @@ -114,11 +114,16 @@ import org.springframework.lang.Nullable; *

    It also automatically registers the following well-known modules if they are * detected on the classpath: *

    * *

    In case you want to configure Jackson's {@link ObjectMapper} with a custom {@link Module}, diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/SpringHandlerInstantiator.java b/spring-web/src/main/java/org/springframework/http/converter/json/SpringHandlerInstantiator.java index ad4874c119d..273d9c5252a 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/SpringHandlerInstantiator.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/SpringHandlerInstantiator.java @@ -70,22 +70,30 @@ public class SpringHandlerInstantiator extends HandlerInstantiator { @Override - public JsonDeserializer deserializerInstance(DeserializationConfig config, Annotated annotated, Class implClass) { + public JsonDeserializer deserializerInstance(DeserializationConfig config, + Annotated annotated, Class implClass) { + return (JsonDeserializer) this.beanFactory.createBean(implClass); } @Override - public KeyDeserializer keyDeserializerInstance(DeserializationConfig config, Annotated annotated, Class implClass) { + public KeyDeserializer keyDeserializerInstance(DeserializationConfig config, + Annotated annotated, Class implClass) { + return (KeyDeserializer) this.beanFactory.createBean(implClass); } @Override - public JsonSerializer serializerInstance(SerializationConfig config, Annotated annotated, Class implClass) { + public JsonSerializer serializerInstance(SerializationConfig config, + Annotated annotated, Class implClass) { + return (JsonSerializer) this.beanFactory.createBean(implClass); } @Override - public TypeResolverBuilder typeResolverBuilderInstance(MapperConfig config, Annotated annotated, Class implClass) { + public TypeResolverBuilder typeResolverBuilderInstance(MapperConfig config, + Annotated annotated, Class implClass) { + return (TypeResolverBuilder) this.beanFactory.createBean(implClass); } @@ -96,31 +104,41 @@ public class SpringHandlerInstantiator extends HandlerInstantiator { /** @since 4.3 */ @Override - public ValueInstantiator valueInstantiatorInstance(MapperConfig config, Annotated annotated, Class implClass) { + public ValueInstantiator valueInstantiatorInstance(MapperConfig config, + Annotated annotated, Class implClass) { + return (ValueInstantiator) this.beanFactory.createBean(implClass); } /** @since 4.3 */ @Override - public ObjectIdGenerator objectIdGeneratorInstance(MapperConfig config, Annotated annotated, Class implClass) { + public ObjectIdGenerator objectIdGeneratorInstance(MapperConfig config, + Annotated annotated, Class implClass) { + return (ObjectIdGenerator) this.beanFactory.createBean(implClass); } /** @since 4.3 */ @Override - public ObjectIdResolver resolverIdGeneratorInstance(MapperConfig config, Annotated annotated, Class implClass) { + public ObjectIdResolver resolverIdGeneratorInstance(MapperConfig config, + Annotated annotated, Class implClass) { + return (ObjectIdResolver) this.beanFactory.createBean(implClass); } /** @since 4.3 */ @Override - public PropertyNamingStrategy namingStrategyInstance(MapperConfig config, Annotated annotated, Class implClass) { + public PropertyNamingStrategy namingStrategyInstance(MapperConfig config, + Annotated annotated, Class implClass) { + return (PropertyNamingStrategy) this.beanFactory.createBean(implClass); } /** @since 4.3 */ @Override - public Converter converterInstance(MapperConfig config, Annotated annotated, Class implClass) { + public Converter converterInstance(MapperConfig config, + Annotated annotated, Class implClass) { + return (Converter) this.beanFactory.createBean(implClass); } diff --git a/spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java index 6e4291cdbf2..2f3e73f07c3 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java @@ -40,20 +40,26 @@ public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConv ClassUtils.isPresent("javax.xml.bind.Binder", AllEncompassingFormHttpMessageConverter.class.getClassLoader()); private static final boolean jackson2Present = - ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", AllEncompassingFormHttpMessageConverter.class.getClassLoader()) && - ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", AllEncompassingFormHttpMessageConverter.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", + AllEncompassingFormHttpMessageConverter.class.getClassLoader()) && + ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", + AllEncompassingFormHttpMessageConverter.class.getClassLoader()); private static final boolean jackson2XmlPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", AllEncompassingFormHttpMessageConverter.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", + AllEncompassingFormHttpMessageConverter.class.getClassLoader()); private static final boolean jackson2SmilePresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", AllEncompassingFormHttpMessageConverter.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", + AllEncompassingFormHttpMessageConverter.class.getClassLoader()); private static final boolean gsonPresent = - ClassUtils.isPresent("com.google.gson.Gson", AllEncompassingFormHttpMessageConverter.class.getClassLoader()); + ClassUtils.isPresent("com.google.gson.Gson", + AllEncompassingFormHttpMessageConverter.class.getClassLoader()); private static final boolean jsonbPresent = - ClassUtils.isPresent("javax.json.bind.Jsonb", AllEncompassingFormHttpMessageConverter.class.getClassLoader()); + ClassUtils.isPresent("javax.json.bind.Jsonb", + AllEncompassingFormHttpMessageConverter.class.getClassLoader()); public AllEncompassingFormHttpMessageConverter() { diff --git a/spring-web/src/main/java/org/springframework/web/HttpMediaTypeNotSupportedException.java b/spring-web/src/main/java/org/springframework/web/HttpMediaTypeNotSupportedException.java index 1a0ff2a7313..aeaa7c98569 100644 --- a/spring-web/src/main/java/org/springframework/web/HttpMediaTypeNotSupportedException.java +++ b/spring-web/src/main/java/org/springframework/web/HttpMediaTypeNotSupportedException.java @@ -50,7 +50,8 @@ public class HttpMediaTypeNotSupportedException extends HttpMediaTypeException { * @param supportedMediaTypes the list of supported media types */ public HttpMediaTypeNotSupportedException(@Nullable MediaType contentType, List supportedMediaTypes) { - this(contentType, supportedMediaTypes, "Content type '" + (contentType != null ? contentType : "") + "' not supported"); + this(contentType, supportedMediaTypes, "Content type '" + + (contentType != null ? contentType : "") + "' not supported"); } /** @@ -59,7 +60,9 @@ public class HttpMediaTypeNotSupportedException extends HttpMediaTypeException { * @param supportedMediaTypes the list of supported media types * @param msg the detail message */ - public HttpMediaTypeNotSupportedException(@Nullable MediaType contentType, List supportedMediaTypes, String msg) { + public HttpMediaTypeNotSupportedException(@Nullable MediaType contentType, + List supportedMediaTypes, String msg) { + super(msg, supportedMediaTypes); this.contentType = contentType; } diff --git a/spring-web/src/main/java/org/springframework/web/bind/EscapedErrors.java b/spring-web/src/main/java/org/springframework/web/bind/EscapedErrors.java index 26adc1974b1..33fb3d7c3ff 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/EscapedErrors.java +++ b/spring-web/src/main/java/org/springframework/web/bind/EscapedErrors.java @@ -110,7 +110,9 @@ public class EscapedErrors implements Errors { } @Override - public void rejectValue(@Nullable String field, String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage) { + public void rejectValue(@Nullable String field, String errorCode, @Nullable Object[] errorArgs, + @Nullable String defaultMessage) { + this.source.rejectValue(field, errorCode, errorArgs, defaultMessage); } diff --git a/spring-web/src/main/java/org/springframework/web/client/AsyncRequestCallback.java b/spring-web/src/main/java/org/springframework/web/client/AsyncRequestCallback.java index dd878b4a449..db252d84119 100644 --- a/spring-web/src/main/java/org/springframework/web/client/AsyncRequestCallback.java +++ b/spring-web/src/main/java/org/springframework/web/client/AsyncRequestCallback.java @@ -19,15 +19,18 @@ package org.springframework.web.client; import java.io.IOException; /** - * Callback interface for code that operates on an {@link org.springframework.http.client.AsyncClientHttpRequest}. Allows - * to manipulate the request headers, and write to the request body. + * Callback interface for code that operates on an + * {@link org.springframework.http.client.AsyncClientHttpRequest}. Allows to + * manipulate the request headers, and write to the request body. * - *

    Used internally by the {@link AsyncRestTemplate}, but also useful for application code. + *

    Used internally by the {@link AsyncRestTemplate}, but also useful for + * application code. * * @author Arjen Poutsma * @see org.springframework.web.client.AsyncRestTemplate#execute * @since 4.0 - * @deprecated as of Spring 5.0, in favor of {@link org.springframework.web.reactive.function.client.ExchangeFilterFunction} + * @deprecated as of Spring 5.0, in favor of + * {@link org.springframework.web.reactive.function.client.ExchangeFilterFunction} */ @FunctionalInterface @Deprecated diff --git a/spring-web/src/main/java/org/springframework/web/client/AsyncRestOperations.java b/spring-web/src/main/java/org/springframework/web/client/AsyncRestOperations.java index f4a141e1d7f..39a3f720448 100644 --- a/spring-web/src/main/java/org/springframework/web/client/AsyncRestOperations.java +++ b/spring-web/src/main/java/org/springframework/web/client/AsyncRestOperations.java @@ -347,8 +347,11 @@ public interface AsyncRestOperations { * The given {@link ParameterizedTypeReference} is used to pass generic type * information: *

    -	 * ParameterizedTypeReference<List<MyBean>> myBean = new ParameterizedTypeReference<List<MyBean>>() {};
    -	 * ResponseEntity<List<MyBean>> response = template.exchange("http://example.com",HttpMethod.GET, null, myBean);
    +	 * ParameterizedTypeReference<List<MyBean>> myBean =
    +	 *     new ParameterizedTypeReference<List<MyBean>>() {};
    +	 *
    +	 * ResponseEntity<List<MyBean>> response =
    +	 *     template.exchange("http://example.com",HttpMethod.GET, null, myBean);
     	 * 
    * @param url the URL * @param method the HTTP method (GET, POST, etc) @@ -368,8 +371,11 @@ public interface AsyncRestOperations { * The given {@link ParameterizedTypeReference} is used to pass generic type * information: *
    -	 * ParameterizedTypeReference<List<MyBean>> myBean = new ParameterizedTypeReference<List<MyBean>>() {};
    -	 * ResponseEntity<List<MyBean>> response = template.exchange("http://example.com",HttpMethod.GET, null, myBean);
    +	 * ParameterizedTypeReference<List<MyBean>> myBean =
    +	 *     new ParameterizedTypeReference<List<MyBean>>() {};
    +	 *
    +	 * ResponseEntity<List<MyBean>> response =
    +	 *     template.exchange("http://example.com",HttpMethod.GET, null, myBean);
     	 * 
    * @param url the URL * @param method the HTTP method (GET, POST, etc) @@ -389,8 +395,11 @@ public interface AsyncRestOperations { * The given {@link ParameterizedTypeReference} is used to pass generic type * information: *
    -	 * ParameterizedTypeReference<List<MyBean>> myBean = new ParameterizedTypeReference<List<MyBean>>() {};
    -	 * ResponseEntity<List<MyBean>> response = template.exchange("http://example.com",HttpMethod.GET, null, myBean);
    +	 * ParameterizedTypeReference<List<MyBean>> myBean =
    +	 *     new ParameterizedTypeReference<List<MyBean>>() {};
    +	 *
    +	 * ResponseEntity<List<MyBean>> response =
    +	 *     template.exchange("http://example.com",HttpMethod.GET, null, myBean);
     	 * 
    * @param url the URL * @param method the HTTP method (GET, POST, etc) diff --git a/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java index e3d1da57032..a3de84037ce 100644 --- a/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java @@ -67,7 +67,8 @@ import org.springframework.web.util.UriTemplateHandler; * @deprecated as of Spring 5.0, in favor of {@link org.springframework.web.reactive.function.client.WebClient} */ @Deprecated -public class AsyncRestTemplate extends org.springframework.http.client.support.InterceptingAsyncHttpAccessor implements AsyncRestOperations { +public class AsyncRestTemplate extends org.springframework.http.client.support.InterceptingAsyncHttpAccessor + implements AsyncRestOperations { private final RestTemplate syncTemplate; @@ -114,8 +115,8 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I * @param asyncRequestFactory the asynchronous request factory * @param syncRequestFactory the synchronous request factory */ - public AsyncRestTemplate( - org.springframework.http.client.AsyncClientHttpRequestFactory asyncRequestFactory, ClientHttpRequestFactory syncRequestFactory) { + public AsyncRestTemplate(org.springframework.http.client.AsyncClientHttpRequestFactory asyncRequestFactory, + ClientHttpRequestFactory syncRequestFactory) { this(asyncRequestFactory, new RestTemplate(syncRequestFactory)); } @@ -126,7 +127,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I * @param requestFactory the asynchronous request factory to use * @param restTemplate the synchronous template to use */ - public AsyncRestTemplate(org.springframework.http.client.AsyncClientHttpRequestFactory requestFactory, RestTemplate restTemplate) { + public AsyncRestTemplate(org.springframework.http.client.AsyncClientHttpRequestFactory requestFactory, + RestTemplate restTemplate) { + Assert.notNull(restTemplate, "RestTemplate must not be null"); this.syncTemplate = restTemplate; setAsyncRequestFactory(requestFactory); @@ -236,7 +239,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture> getForEntity(URI url, Class responseType) throws RestClientException { + public ListenableFuture> getForEntity(URI url, Class responseType) + throws RestClientException { + AsyncRequestCallback requestCallback = acceptHeaderRequestCallback(responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); return execute(url, HttpMethod.GET, requestCallback, responseExtractor); @@ -246,13 +251,17 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I // HEAD @Override - public ListenableFuture headForHeaders(String url, Object... uriVariables) throws RestClientException { + public ListenableFuture headForHeaders(String url, Object... uriVariables) + throws RestClientException { + ResponseExtractor headersExtractor = headersExtractor(); return execute(url, HttpMethod.HEAD, null, headersExtractor, uriVariables); } @Override - public ListenableFuture headForHeaders(String url, Map uriVariables) throws RestClientException { + public ListenableFuture headForHeaders(String url, Map uriVariables) + throws RestClientException { + ResponseExtractor headersExtractor = headersExtractor(); return execute(url, HttpMethod.HEAD, null, headersExtractor, uriVariables); } @@ -287,7 +296,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture postForLocation(URI url, @Nullable HttpEntity request) throws RestClientException { + public ListenableFuture postForLocation(URI url, @Nullable HttpEntity request) + throws RestClientException { + AsyncRequestCallback callback = httpEntityCallback(request); ResponseExtractor extractor = headersExtractor(); ListenableFuture future = execute(url, HttpMethod.POST, callback, extractor); @@ -323,8 +334,8 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture> postForEntity(URI url, @Nullable HttpEntity request, Class responseType) - throws RestClientException { + public ListenableFuture> postForEntity(URI url, + @Nullable HttpEntity request, Class responseType) throws RestClientException { AsyncRequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -335,15 +346,19 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I // PUT @Override - public ListenableFuture put(String url, @Nullable HttpEntity request, Object... uriVariables) throws RestClientException { + public ListenableFuture put(String url, @Nullable HttpEntity request, Object... uriVars) + throws RestClientException { + AsyncRequestCallback requestCallback = httpEntityCallback(request); - return execute(url, HttpMethod.PUT, requestCallback, null, uriVariables); + return execute(url, HttpMethod.PUT, requestCallback, null, uriVars); } @Override - public ListenableFuture put(String url, @Nullable HttpEntity request, Map uriVariables) throws RestClientException { + public ListenableFuture put(String url, @Nullable HttpEntity request, Map uriVars) + throws RestClientException { + AsyncRequestCallback requestCallback = httpEntityCallback(request); - return execute(url, HttpMethod.PUT, requestCallback, null, uriVariables); + return execute(url, HttpMethod.PUT, requestCallback, null, uriVars); } @Override @@ -374,14 +389,18 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I // OPTIONS @Override - public ListenableFuture> optionsForAllow(String url, Object... uriVars) throws RestClientException { + public ListenableFuture> optionsForAllow(String url, Object... uriVars) + throws RestClientException { + ResponseExtractor extractor = headersExtractor(); ListenableFuture future = execute(url, HttpMethod.OPTIONS, null, extractor, uriVars); return adaptToAllowHeader(future); } @Override - public ListenableFuture> optionsForAllow(String url, Map uriVars) throws RestClientException { + public ListenableFuture> optionsForAllow(String url, Map uriVars) + throws RestClientException { + ResponseExtractor extractor = headersExtractor(); ListenableFuture future = execute(url, HttpMethod.OPTIONS, null, extractor, uriVars); return adaptToAllowHeader(future); @@ -406,8 +425,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I // exchange @Override - public ListenableFuture> exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - Class responseType, Object... uriVariables) throws RestClientException { + public ListenableFuture> exchange(String url, HttpMethod method, + @Nullable HttpEntity requestEntity, Class responseType, Object... uriVariables) + throws RestClientException { AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -415,8 +435,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture> exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - Class responseType, Map uriVariables) throws RestClientException { + public ListenableFuture> exchange(String url, HttpMethod method, + @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) + throws RestClientException { AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -424,8 +445,8 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture> exchange(URI url, HttpMethod method, @Nullable HttpEntity requestEntity, - Class responseType) throws RestClientException { + public ListenableFuture> exchange(URI url, HttpMethod method, + @Nullable HttpEntity requestEntity, Class responseType) throws RestClientException { AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -433,8 +454,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture> exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - ParameterizedTypeReference responseType, Object... uriVariables) throws RestClientException { + public ListenableFuture> exchange(String url, HttpMethod method, + @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType, + Object... uriVariables) throws RestClientException { Type type = responseType.getType(); AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); @@ -443,8 +465,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture> exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, - ParameterizedTypeReference responseType, Map uriVariables) throws RestClientException { + public ListenableFuture> exchange(String url, HttpMethod method, + @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType, + Map uriVariables) throws RestClientException { Type type = responseType.getType(); AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); @@ -453,8 +476,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture> exchange(URI url, HttpMethod method, @Nullable HttpEntity requestEntity, - ParameterizedTypeReference responseType) throws RestClientException { + public ListenableFuture> exchange(URI url, HttpMethod method, + @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType) + throws RestClientException { Type type = responseType.getType(); AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); @@ -474,15 +498,17 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public ListenableFuture execute(String url, HttpMethod method, @Nullable AsyncRequestCallback requestCallback, - @Nullable ResponseExtractor responseExtractor, Map uriVariables) throws RestClientException { + public ListenableFuture execute(String url, HttpMethod method, + @Nullable AsyncRequestCallback requestCallback, @Nullable ResponseExtractor responseExtractor, + Map uriVariables) throws RestClientException { URI expanded = getUriTemplateHandler().expand(url, uriVariables); return doExecute(expanded, method, requestCallback, responseExtractor); } @Override - public ListenableFuture execute(URI url, HttpMethod method, @Nullable AsyncRequestCallback requestCallback, + public ListenableFuture execute(URI url, HttpMethod method, + @Nullable AsyncRequestCallback requestCallback, @Nullable ResponseExtractor responseExtractor) throws RestClientException { return doExecute(url, method, requestCallback, responseExtractor); @@ -500,7 +526,8 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I * be {@code null}) * @return an arbitrary object, as returned by the {@link ResponseExtractor} */ - protected ListenableFuture doExecute(URI url, HttpMethod method, @Nullable AsyncRequestCallback requestCallback, + protected ListenableFuture doExecute(URI url, HttpMethod method, + @Nullable AsyncRequestCallback requestCallback, @Nullable ResponseExtractor responseExtractor) throws RestClientException { Assert.notNull(url, "'url' must not be null"); @@ -651,7 +678,9 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I } @Override - public void doWithRequest(final org.springframework.http.client.AsyncClientHttpRequest request) throws IOException { + public void doWithRequest(final org.springframework.http.client.AsyncClientHttpRequest request) + throws IOException { + this.adaptee.doWithRequest(new ClientHttpRequest() { @Override public ClientHttpResponse execute() throws IOException { diff --git a/spring-web/src/main/java/org/springframework/web/client/RestOperations.java b/spring-web/src/main/java/org/springframework/web/client/RestOperations.java index a24216bfbf3..9cfac8356ce 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestOperations.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestOperations.java @@ -87,7 +87,8 @@ public interface RestOperations { * @return the entity * @since 3.0.2 */ - ResponseEntity getForEntity(String url, Class responseType, Object... uriVariables) throws RestClientException; + ResponseEntity getForEntity(String url, Class responseType, Object... uriVariables) + throws RestClientException; /** * Retrieve a representation by doing a GET on the URI template. @@ -99,7 +100,8 @@ public interface RestOperations { * @return the converted object * @since 3.0.2 */ - ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) throws RestClientException; + ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) + throws RestClientException; /** * Retrieve a representation by doing a GET on the URL . @@ -170,7 +172,8 @@ public interface RestOperations { * @see HttpEntity */ @Nullable - URI postForLocation(String url, @Nullable Object request, Map uriVariables) throws RestClientException; + URI postForLocation(String url, @Nullable Object request, Map uriVariables) + throws RestClientException; /** * Create a new resource by POSTing the given object to the URL, and returns the value of the @@ -199,8 +202,8 @@ public interface RestOperations { * @see HttpEntity */ @Nullable - T postForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables) - throws RestClientException; + T postForObject(String url, @Nullable Object request, Class responseType, + Object... uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, @@ -216,8 +219,8 @@ public interface RestOperations { * @see HttpEntity */ @Nullable - T postForObject(String url, @Nullable Object request, Class responseType, Map uriVariables) - throws RestClientException; + T postForObject(String url, @Nullable Object request, Class responseType, + Map uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URL, @@ -246,8 +249,8 @@ public interface RestOperations { * @since 3.0.2 * @see HttpEntity */ - ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Object... uriVariables) - throws RestClientException; + ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, + Object... uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, @@ -262,8 +265,8 @@ public interface RestOperations { * @since 3.0.2 * @see HttpEntity */ - ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Map uriVariables) - throws RestClientException; + ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, + Map uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URL, @@ -276,7 +279,8 @@ public interface RestOperations { * @since 3.0.2 * @see HttpEntity */ - ResponseEntity postForEntity(URI url, @Nullable Object request, Class responseType) throws RestClientException; + ResponseEntity postForEntity(URI url, @Nullable Object request, Class responseType) + throws RestClientException; // PUT @@ -361,8 +365,8 @@ public interface RestOperations { * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ @Nullable - T patchForObject(String url, @Nullable Object request, Class responseType, Map uriVariables) - throws RestClientException; + T patchForObject(String url, @Nullable Object request, Class responseType, + Map uriVariables) throws RestClientException; /** * Update a resource by PATCHing the given object to the URL, @@ -382,7 +386,8 @@ public interface RestOperations { * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ @Nullable - T patchForObject(URI url, @Nullable Object request, Class responseType) throws RestClientException; + T patchForObject(URI url, @Nullable Object request, Class responseType) + throws RestClientException; @@ -493,8 +498,11 @@ public interface RestOperations { * request entity to the request, and returns the response as {@link ResponseEntity}. * The given {@link ParameterizedTypeReference} is used to pass generic type information: *
    -	 * ParameterizedTypeReference<List<MyBean>> myBean = new ParameterizedTypeReference<List<MyBean>>() {};
    -	 * ResponseEntity<List<MyBean>> response = template.exchange("http://example.com",HttpMethod.GET, null, myBean);
    +	 * ParameterizedTypeReference<List<MyBean>> myBean =
    +	 *     new ParameterizedTypeReference<List<MyBean>>() {};
    +	 *
    +	 * ResponseEntity<List<MyBean>> response =
    +	 *     template.exchange("http://example.com",HttpMethod.GET, null, myBean);
     	 * 
    * @param url the URL * @param method the HTTP method (GET, POST, etc) @@ -513,8 +521,11 @@ public interface RestOperations { * request entity to the request, and returns the response as {@link ResponseEntity}. * The given {@link ParameterizedTypeReference} is used to pass generic type information: *
    -	 * ParameterizedTypeReference<List<MyBean>> myBean = new ParameterizedTypeReference<List<MyBean>>() {};
    -	 * ResponseEntity<List<MyBean>> response = template.exchange("http://example.com",HttpMethod.GET, null, myBean);
    +	 * ParameterizedTypeReference<List<MyBean>> myBean =
    +	 *     new ParameterizedTypeReference<List<MyBean>>() {};
    +	 *
    +	 * ResponseEntity<List<MyBean>> response =
    +	 *     template.exchange("http://example.com",HttpMethod.GET, null, myBean);
     	 * 
    * @param url the URL * @param method the HTTP method (GET, POST, etc) @@ -533,8 +544,11 @@ public interface RestOperations { * request entity to the request, and returns the response as {@link ResponseEntity}. * The given {@link ParameterizedTypeReference} is used to pass generic type information: *
    -	 * ParameterizedTypeReference<List<MyBean>> myBean = new ParameterizedTypeReference<List<MyBean>>() {};
    -	 * ResponseEntity<List<MyBean>> response = template.exchange("http://example.com",HttpMethod.GET, null, myBean);
    +	 * ParameterizedTypeReference<List<MyBean>> myBean =
    +	 *     new ParameterizedTypeReference<List<MyBean>>() {};
    +	 *
    +	 * ResponseEntity<List<MyBean>> response =
    +	 *     template.exchange("http://example.com",HttpMethod.GET, null, myBean);
     	 * 
    * @param url the URL * @param method the HTTP method (GET, POST, etc) @@ -553,7 +567,10 @@ public interface RestOperations { * with the static builder methods on {@code RequestEntity}, for instance: *
     	 * MyRequest body = ...
    -	 * RequestEntity request = RequestEntity.post(new URI("http://example.com/foo")).accept(MediaType.APPLICATION_JSON).body(body);
    +	 * RequestEntity request = RequestEntity
    +	 *     .post(new URI("http://example.com/foo"))
    +	 *     .accept(MediaType.APPLICATION_JSON)
    +	 *     .body(body);
     	 * ResponseEntity<MyResponse> response = template.exchange(request, MyResponse.class);
     	 * 
    * @param requestEntity the entity to write to the request @@ -561,7 +578,8 @@ public interface RestOperations { * @return the response as entity * @since 4.1 */ - ResponseEntity exchange(RequestEntity requestEntity, Class responseType) throws RestClientException; + ResponseEntity exchange(RequestEntity requestEntity, Class responseType) + throws RestClientException; /** * Execute the request specified in the given {@link RequestEntity} and return @@ -569,8 +587,12 @@ public interface RestOperations { * {@link ParameterizedTypeReference} is used to pass generic type information: *
     	 * MyRequest body = ...
    -	 * RequestEntity request = RequestEntity.post(new URI("http://example.com/foo")).accept(MediaType.APPLICATION_JSON).body(body);
    -	 * ParameterizedTypeReference<List<MyResponse>> myBean = new ParameterizedTypeReference<List<MyResponse>>() {};
    +	 * RequestEntity request = RequestEntity
    +	 *     .post(new URI("http://example.com/foo"))
    +	 *     .accept(MediaType.APPLICATION_JSON)
    +	 *     .body(body);
    +	 * ParameterizedTypeReference<List<MyResponse>> myBean =
    +	 *     new ParameterizedTypeReference<List<MyResponse>>() {};
     	 * ResponseEntity<List<MyResponse>> response = template.exchange(request, myBean);
     	 * 
    * @param requestEntity the entity to write to the request @@ -597,7 +619,8 @@ public interface RestOperations { */ @Nullable T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback, - @Nullable ResponseExtractor responseExtractor, Object... uriVariables) throws RestClientException; + @Nullable ResponseExtractor responseExtractor, Object... uriVariables) + throws RestClientException; /** * Execute the HTTP method to the given URI template, preparing the request with the @@ -612,7 +635,8 @@ public interface RestOperations { */ @Nullable T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback, - @Nullable ResponseExtractor responseExtractor, Map uriVariables) throws RestClientException; + @Nullable ResponseExtractor responseExtractor, Map uriVariables) + throws RestClientException; /** * Execute the HTTP method to the given URL, preparing the request with the diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index 171b441489d..3aec0538e1f 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -385,7 +385,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override @Nullable - public URI postForLocation(String url, @Nullable Object request, Object... uriVariables) throws RestClientException { + public URI postForLocation(String url, @Nullable Object request, Object... uriVariables) + throws RestClientException { + RequestCallback requestCallback = httpEntityCallback(request); HttpHeaders headers = execute(url, HttpMethod.POST, requestCallback, headersExtractor(), uriVariables); return (headers != null ? headers.getLocation() : null); @@ -393,7 +395,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override @Nullable - public URI postForLocation(String url, @Nullable Object request, Map uriVariables) throws RestClientException { + public URI postForLocation(String url, @Nullable Object request, Map uriVariables) + throws RestClientException { + RequestCallback requestCallback = httpEntityCallback(request); HttpHeaders headers = execute(url, HttpMethod.POST, requestCallback, headersExtractor(), uriVariables); return (headers != null ? headers.getLocation() : null); @@ -409,8 +413,8 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override @Nullable - public T postForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables) - throws RestClientException { + public T postForObject(String url, @Nullable Object request, Class responseType, + Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = @@ -420,8 +424,8 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override @Nullable - public T postForObject(String url, @Nullable Object request, Class responseType, Map uriVariables) - throws RestClientException { + public T postForObject(String url, @Nullable Object request, Class responseType, + Map uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = @@ -431,7 +435,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override @Nullable - public T postForObject(URI url, @Nullable Object request, Class responseType) throws RestClientException { + public T postForObject(URI url, @Nullable Object request, Class responseType) + throws RestClientException { + RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor responseExtractor = new HttpMessageConverterExtractor<>(responseType, getMessageConverters()); @@ -439,8 +445,8 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } @Override - public ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Object... uriVariables) - throws RestClientException { + public ResponseEntity postForEntity(String url, @Nullable Object request, + Class responseType, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -448,8 +454,8 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } @Override - public ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Map uriVariables) - throws RestClientException { + public ResponseEntity postForEntity(String url, @Nullable Object request, + Class responseType, Map uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -457,7 +463,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } @Override - public ResponseEntity postForEntity(URI url, @Nullable Object request, Class responseType) throws RestClientException { + public ResponseEntity postForEntity(URI url, @Nullable Object request, Class responseType) + throws RestClientException { + RequestCallback requestCallback = httpEntityCallback(request, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); return nonNull(execute(url, HttpMethod.POST, requestCallback, responseExtractor)); @@ -467,13 +475,17 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat // PUT @Override - public void put(String url, @Nullable Object request, Object... uriVariables) throws RestClientException { + public void put(String url, @Nullable Object request, Object... uriVariables) + throws RestClientException { + RequestCallback requestCallback = httpEntityCallback(request); execute(url, HttpMethod.PUT, requestCallback, null, uriVariables); } @Override - public void put(String url, @Nullable Object request, Map uriVariables) throws RestClientException { + public void put(String url, @Nullable Object request, Map uriVariables) + throws RestClientException { + RequestCallback requestCallback = httpEntityCallback(request); execute(url, HttpMethod.PUT, requestCallback, null, uriVariables); } @@ -567,7 +579,8 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public ResponseEntity exchange(String url, HttpMethod method, - @Nullable HttpEntity requestEntity, Class responseType, Object... uriVariables) throws RestClientException { + @Nullable HttpEntity requestEntity, Class responseType, Object... uriVariables) + throws RestClientException { RequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -576,7 +589,8 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override public ResponseEntity exchange(String url, HttpMethod method, - @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) throws RestClientException { + @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) + throws RestClientException { RequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); ResponseExtractor> responseExtractor = responseEntityExtractor(responseType); @@ -660,7 +674,8 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat @Override @Nullable public T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback, - @Nullable ResponseExtractor responseExtractor, Map uriVariables) throws RestClientException { + @Nullable ResponseExtractor responseExtractor, Map uriVariables) + throws RestClientException { URI expanded = getUriTemplateHandler().expand(url, uriVariables); return doExecute(expanded, method, requestCallback, responseExtractor); @@ -898,8 +913,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat MediaType requestContentType = requestHeaders.getContentType(); for (HttpMessageConverter messageConverter : getMessageConverters()) { if (messageConverter instanceof GenericHttpMessageConverter) { - GenericHttpMessageConverter genericMessageConverter = (GenericHttpMessageConverter) messageConverter; - if (genericMessageConverter.canWrite(requestBodyType, requestBodyClass, requestContentType)) { + GenericHttpMessageConverter genericConverter = + (GenericHttpMessageConverter) messageConverter; + if (genericConverter.canWrite(requestBodyType, requestBodyClass, requestContentType)) { if (!requestHeaders.isEmpty()) { httpRequest.getHeaders().putAll(requestHeaders); } @@ -913,8 +929,7 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } } - genericMessageConverter.write( - requestBody, requestBodyType, requestContentType, httpRequest); + genericConverter.write(requestBody, requestBodyType, requestContentType, httpRequest); return; } } diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResultInterceptorChain.java b/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResultInterceptorChain.java index 58399f87e60..b87fc43ee49 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResultInterceptorChain.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResultInterceptorChain.java @@ -42,7 +42,9 @@ class DeferredResultInterceptorChain { this.interceptors = interceptors; } - public void applyBeforeConcurrentHandling(NativeWebRequest request, DeferredResult deferredResult) throws Exception { + public void applyBeforeConcurrentHandling(NativeWebRequest request, DeferredResult deferredResult) + throws Exception { + for (DeferredResultProcessingInterceptor interceptor : this.interceptors) { interceptor.beforeConcurrentHandling(request, deferredResult); } @@ -55,7 +57,9 @@ class DeferredResultInterceptorChain { } } - public Object applyPostProcess(NativeWebRequest request, DeferredResult deferredResult, Object concurrentResult) { + public Object applyPostProcess(NativeWebRequest request, DeferredResult deferredResult, + Object concurrentResult) { + try { for (int i = this.preProcessingIndex; i >= 0; i--) { this.interceptors.get(i).postProcess(request, deferredResult, concurrentResult); @@ -78,12 +82,14 @@ class DeferredResultInterceptorChain { } } - public void triggerAfterError(NativeWebRequest request, DeferredResult deferredResult, Throwable t) throws Exception { + public void triggerAfterError(NativeWebRequest request, DeferredResult deferredResult, Throwable ex) + throws Exception { + for (DeferredResultProcessingInterceptor interceptor : this.interceptors) { if (deferredResult.isSetOrExpired()) { return; } - if (!interceptor.handleError(request, deferredResult, t)){ + if (!interceptor.handleError(request, deferredResult, ex)){ break; } } diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java index 0fac50969be..1a525dbaba4 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java @@ -270,7 +270,9 @@ public final class WebAsyncManager { * via {@link #getConcurrentResultContext()} * @throws Exception if concurrent processing failed to start */ - public void startCallableProcessing(final WebAsyncTask webAsyncTask, Object... processingContext) throws Exception { + public void startCallableProcessing(final WebAsyncTask webAsyncTask, Object... processingContext) + throws Exception { + Assert.notNull(webAsyncTask, "WebAsyncTask must not be null"); Assert.state(this.asyncWebRequest != null, "AsyncWebRequest must not be null"); diff --git a/spring-web/src/main/java/org/springframework/web/context/support/RequestHandledEvent.java b/spring-web/src/main/java/org/springframework/web/context/support/RequestHandledEvent.java index 449147924a1..bbe274ad1ec 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/RequestHandledEvent.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/RequestHandledEvent.java @@ -61,7 +61,9 @@ public class RequestHandledEvent extends ApplicationEvent { * request, if any (usually the UserPrincipal) * @param processingTimeMillis the processing time of the request in milliseconds */ - public RequestHandledEvent(Object source, @Nullable String sessionId, @Nullable String userName, long processingTimeMillis) { + public RequestHandledEvent(Object source, @Nullable String sessionId, @Nullable String userName, + long processingTimeMillis) { + super(source); this.sessionId = sessionId; this.userName = userName; @@ -77,8 +79,8 @@ public class RequestHandledEvent extends ApplicationEvent { * @param processingTimeMillis the processing time of the request in milliseconds * @param failureCause the cause of failure, if any */ - public RequestHandledEvent( - Object source, @Nullable String sessionId, @Nullable String userName, long processingTimeMillis, @Nullable Throwable failureCause) { + public RequestHandledEvent(Object source, @Nullable String sessionId, @Nullable String userName, + long processingTimeMillis, @Nullable Throwable failureCause) { this(source, sessionId, userName, processingTimeMillis); this.failureCause = failureCause; diff --git a/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationContextUtils.java b/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationContextUtils.java index 58250012d36..9395ceee65a 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationContextUtils.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationContextUtils.java @@ -21,7 +21,6 @@ import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; - import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.ServletConfig; @@ -180,7 +179,9 @@ public abstract class WebApplicationContextUtils { * @param beanFactory the BeanFactory to configure * @param sc the ServletContext that we're running within */ - public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory, @Nullable ServletContext sc) { + public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory, + @Nullable ServletContext sc) { + beanFactory.registerScope(WebApplicationContext.SCOPE_REQUEST, new RequestScope()); beanFactory.registerScope(WebApplicationContext.SCOPE_SESSION, new SessionScope()); if (sc != null) { @@ -278,7 +279,7 @@ public abstract class WebApplicationContextUtils { *

    This method is idempotent with respect to the fact it may be called any number * of times but will perform replacement of stub property sources with their * corresponding actual property sources once and only once. - * @param propertySources the {@link MutablePropertySources} to initialize (must not + * @param sources the {@link MutablePropertySources} to initialize (must not * be {@code null}) * @param servletContext the current {@link ServletContext} (ignored if {@code null} * or if the {@link StandardServletEnvironment#SERVLET_CONTEXT_PROPERTY_SOURCE_NAME @@ -289,19 +290,17 @@ public abstract class WebApplicationContextUtils { * @see org.springframework.core.env.PropertySource.StubPropertySource * @see org.springframework.core.env.ConfigurableEnvironment#getPropertySources() */ - public static void initServletPropertySources( - MutablePropertySources propertySources, @Nullable ServletContext servletContext, @Nullable ServletConfig servletConfig) { - - Assert.notNull(propertySources, "'propertySources' must not be null"); - if (servletContext != null && propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME) && - propertySources.get(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME) instanceof StubPropertySource) { - propertySources.replace(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME, - new ServletContextPropertySource(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME, servletContext)); + public static void initServletPropertySources(MutablePropertySources sources, + @Nullable ServletContext servletContext, @Nullable ServletConfig servletConfig) { + + Assert.notNull(sources, "'propertySources' must not be null"); + String name = StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME; + if (servletContext != null && sources.contains(name) && sources.get(name) instanceof StubPropertySource) { + sources.replace(name, new ServletContextPropertySource(name, servletContext)); } - if (servletConfig != null && propertySources.contains(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME) && - propertySources.get(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME) instanceof StubPropertySource) { - propertySources.replace(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME, - new ServletConfigPropertySource(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME, servletConfig)); + name = StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME; + if (servletConfig != null && sources.contains(name) && sources.get(name) instanceof StubPropertySource) { + sources.replace(name, new ServletConfigPropertySource(name, servletConfig)); } } diff --git a/spring-web/src/main/java/org/springframework/web/cors/DefaultCorsProcessor.java b/spring-web/src/main/java/org/springframework/web/cors/DefaultCorsProcessor.java index ecd195ae7d0..e90d450751f 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/DefaultCorsProcessor.java +++ b/spring-web/src/main/java/org/springframework/web/cors/DefaultCorsProcessor.java @@ -58,8 +58,8 @@ public class DefaultCorsProcessor implements CorsProcessor { @Override @SuppressWarnings("resource") - public boolean processRequest(@Nullable CorsConfiguration config, HttpServletRequest request, HttpServletResponse response) - throws IOException { + public boolean processRequest(@Nullable CorsConfiguration config, HttpServletRequest request, + HttpServletResponse response) throws IOException { if (!CorsUtils.isCorsRequest(request)) { return true; diff --git a/spring-web/src/main/java/org/springframework/web/jsf/DecoratingNavigationHandler.java b/spring-web/src/main/java/org/springframework/web/jsf/DecoratingNavigationHandler.java index 9e1dd275ab9..7e317029f80 100644 --- a/spring-web/src/main/java/org/springframework/web/jsf/DecoratingNavigationHandler.java +++ b/spring-web/src/main/java/org/springframework/web/jsf/DecoratingNavigationHandler.java @@ -98,8 +98,8 @@ public abstract class DecoratingNavigationHandler extends NavigationHandler { * or {@code null} if none * @see #callNextHandlerInChain */ - public abstract void handleNavigation( - FacesContext facesContext, @Nullable String fromAction, @Nullable String outcome, @Nullable NavigationHandler originalNavigationHandler); + public abstract void handleNavigation(FacesContext facesContext, @Nullable String fromAction, + @Nullable String outcome, @Nullable NavigationHandler originalNavigationHandler); /** @@ -130,8 +130,8 @@ public abstract class DecoratingNavigationHandler extends NavigationHandler { * @param originalNavigationHandler the original NavigationHandler, * or {@code null} if none */ - protected final void callNextHandlerInChain( - FacesContext facesContext, @Nullable String fromAction, @Nullable String outcome, @Nullable NavigationHandler originalNavigationHandler) { + protected final void callNextHandlerInChain(FacesContext facesContext, @Nullable String fromAction, + @Nullable String outcome, @Nullable NavigationHandler originalNavigationHandler) { NavigationHandler decoratedNavigationHandler = getDecoratedNavigationHandler(); diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolver.java index 20e2513374b..3bb5126388a 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolver.java @@ -100,7 +100,9 @@ public class RequestParamMethodArgumentResolver extends AbstractNamedValueMethod * is treated as a request parameter even if it isn't annotated, the * request parameter name is derived from the method parameter name. */ - public RequestParamMethodArgumentResolver(@Nullable ConfigurableBeanFactory beanFactory, boolean useDefaultResolution) { + public RequestParamMethodArgumentResolver(@Nullable ConfigurableBeanFactory beanFactory, + boolean useDefaultResolution) { + super(beanFactory); this.useDefaultResolution = useDefaultResolution; } diff --git a/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolverComposite.java b/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolverComposite.java index 130f616f148..7d872510d2a 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolverComposite.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolverComposite.java @@ -72,7 +72,9 @@ public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgu /** * Add the given {@link HandlerMethodArgumentResolver}s. */ - public HandlerMethodArgumentResolverComposite addResolvers(@Nullable List resolvers) { + public HandlerMethodArgumentResolverComposite addResolvers( + @Nullable List resolvers) { + if (resolvers != null) { for (HandlerMethodArgumentResolver resolver : resolvers) { this.argumentResolvers.add(resolver); diff --git a/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java b/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java index f70dcab9bd0..99151906776 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java @@ -76,7 +76,9 @@ public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpSe * first access of multipart files or parameters * @throws MultipartException if an immediate parsing attempt failed */ - public StandardMultipartHttpServletRequest(HttpServletRequest request, boolean lazyParsing) throws MultipartException { + public StandardMultipartHttpServletRequest(HttpServletRequest request, + boolean lazyParsing) throws MultipartException { + super(request); if (!lazyParsing) { parseRequest(request); diff --git a/spring-web/src/main/java/org/springframework/web/util/ServletContextPropertyUtils.java b/spring-web/src/main/java/org/springframework/web/util/ServletContextPropertyUtils.java index 900ac6c800e..e9ed3c13635 100644 --- a/spring-web/src/main/java/org/springframework/web/util/ServletContextPropertyUtils.java +++ b/spring-web/src/main/java/org/springframework/web/util/ServletContextPropertyUtils.java @@ -73,13 +73,16 @@ public abstract class ServletContextPropertyUtils { * @see SystemPropertyUtils#resolvePlaceholders(String, boolean) * @throws IllegalArgumentException if there is an unresolvable placeholder and the flag is false */ - public static String resolvePlaceholders(String text, ServletContext servletContext, boolean ignoreUnresolvablePlaceholders) { + public static String resolvePlaceholders(String text, ServletContext servletContext, + boolean ignoreUnresolvablePlaceholders) { + PropertyPlaceholderHelper helper = (ignoreUnresolvablePlaceholders ? nonStrictHelper : strictHelper); return helper.replacePlaceholders(text, new ServletContextPlaceholderResolver(text, servletContext)); } - private static class ServletContextPlaceholderResolver implements PropertyPlaceholderHelper.PlaceholderResolver { + private static class ServletContextPlaceholderResolver + implements PropertyPlaceholderHelper.PlaceholderResolver { private final String text; diff --git a/spring-web/src/main/java/org/springframework/web/util/TagUtils.java b/spring-web/src/main/java/org/springframework/web/util/TagUtils.java index 59d2faacb65..c0a49a871ad 100644 --- a/spring-web/src/main/java/org/springframework/web/util/TagUtils.java +++ b/spring-web/src/main/java/org/springframework/web/util/TagUtils.java @@ -125,11 +125,14 @@ public abstract class TagUtils { * type-assignable to the {@link Tag} class * @see #hasAncestorOfType(javax.servlet.jsp.tagext.Tag, Class) */ - public static void assertHasAncestorOfType(Tag tag, Class ancestorTagClass, String tagName, String ancestorTagName) { + public static void assertHasAncestorOfType(Tag tag, Class ancestorTagClass, String tagName, + String ancestorTagName) { + Assert.hasText(tagName, "'tagName' must not be empty"); Assert.hasText(ancestorTagName, "'ancestorTagName' must not be empty"); if (!TagUtils.hasAncestorOfType(tag, ancestorTagClass)) { - throw new IllegalStateException("The '" + tagName + "' tag can only be used inside a valid '" + ancestorTagName + "' tag."); + throw new IllegalStateException("The '" + tagName + + "' tag can only be used inside a valid '" + ancestorTagName + "' tag."); } } diff --git a/spring-web/src/main/java/org/springframework/web/util/UriUtils.java b/spring-web/src/main/java/org/springframework/web/util/UriUtils.java index f47e3e84dfa..f1a1aa1e1af 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriUtils.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriUtils.java @@ -229,8 +229,11 @@ public abstract class UriUtils { * @return the encoded query parameter * @throws UnsupportedEncodingException when the given encoding parameter is not supported */ - public static String encodeQueryParam(String queryParam, String encoding) throws UnsupportedEncodingException { - return HierarchicalUriComponents.encodeUriComponent(queryParam, encoding, HierarchicalUriComponents.Type.QUERY_PARAM); + public static String encodeQueryParam(String queryParam, String encoding) + throws UnsupportedEncodingException { + + return HierarchicalUriComponents.encodeUriComponent( + queryParam, encoding, HierarchicalUriComponents.Type.QUERY_PARAM); } /** @@ -241,7 +244,8 @@ public abstract class UriUtils { * @since 5.0 */ public static String encodeQueryParam(String queryParam, Charset charset) { - return HierarchicalUriComponents.encodeUriComponent(queryParam, charset, HierarchicalUriComponents.Type.QUERY_PARAM); + return HierarchicalUriComponents.encodeUriComponent( + queryParam, charset, HierarchicalUriComponents.Type.QUERY_PARAM); } /** @@ -251,8 +255,11 @@ public abstract class UriUtils { * @return the encoded fragment * @throws UnsupportedEncodingException when the given encoding parameter is not supported */ - public static String encodeFragment(String fragment, String encoding) throws UnsupportedEncodingException { - return HierarchicalUriComponents.encodeUriComponent(fragment, encoding, HierarchicalUriComponents.Type.FRAGMENT); + public static String encodeFragment(String fragment, String encoding) + throws UnsupportedEncodingException { + + return HierarchicalUriComponents.encodeUriComponent( + fragment, encoding, HierarchicalUriComponents.Type.FRAGMENT); } /** diff --git a/spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java b/spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java index 6a89d8557af..3994f209279 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java +++ b/spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java @@ -554,7 +554,9 @@ public class UrlPathHelper { * @param vars URI variables extracted from the URL path * @return the same Map or a new Map instance */ - public MultiValueMap decodeMatrixVariables(HttpServletRequest request, MultiValueMap vars) { + public MultiValueMap decodeMatrixVariables(HttpServletRequest request, + MultiValueMap vars) { + if (this.urlDecode) { return vars; } diff --git a/spring-web/src/main/java/org/springframework/web/util/WebUtils.java b/spring-web/src/main/java/org/springframework/web/util/WebUtils.java index d51c005575a..1bac2328dc1 100644 --- a/spring-web/src/main/java/org/springframework/web/util/WebUtils.java +++ b/spring-web/src/main/java/org/springframework/web/util/WebUtils.java @@ -435,7 +435,9 @@ public abstract class WebUtils { * @param ex the exception encountered * @param servletName the name of the offending servlet */ - public static void exposeErrorRequestAttributes(HttpServletRequest request, Throwable ex, @Nullable String servletName) { + public static void exposeErrorRequestAttributes(HttpServletRequest request, Throwable ex, + @Nullable String servletName) { + exposeRequestAttributeIfNotPresent(request, ERROR_STATUS_CODE_ATTRIBUTE, HttpServletResponse.SC_OK); exposeRequestAttributeIfNotPresent(request, ERROR_EXCEPTION_TYPE_ATTRIBUTE, ex.getClass()); exposeRequestAttributeIfNotPresent(request, ERROR_MESSAGE_ATTRIBUTE, ex.getMessage()); diff --git a/spring-web/src/main/java/org/springframework/web/util/pattern/CaptureVariablePathElement.java b/spring-web/src/main/java/org/springframework/web/util/pattern/CaptureVariablePathElement.java index 510f31894ca..254ef2611e0 100644 --- a/spring-web/src/main/java/org/springframework/web/util/pattern/CaptureVariablePathElement.java +++ b/spring-web/src/main/java/org/springframework/web/util/pattern/CaptureVariablePathElement.java @@ -82,7 +82,8 @@ class CaptureVariablePathElement extends PathElement { } if (this.constraintPattern != null) { - // TODO possible optimization - only regex match if rest of pattern matches? Benefit likely to vary pattern to pattern + // TODO possible optimization - only regex match if rest of pattern matches? + // Benefit likely to vary pattern to pattern Matcher matcher = constraintPattern.matcher(candidateCapture); if (matcher.groupCount() != 0) { throw new IllegalArgumentException( @@ -117,7 +118,8 @@ class CaptureVariablePathElement extends PathElement { } if (match && matchingContext.extractingVariables) { - matchingContext.set(this.variableName, candidateCapture, ((PathSegment)matchingContext.pathElements.get(pathIndex-1)).parameters()); + matchingContext.set(this.variableName, candidateCapture, + ((PathSegment)matchingContext.pathElements.get(pathIndex-1)).parameters()); } return match; } diff --git a/spring-web/src/main/java/org/springframework/web/util/pattern/PathPattern.java b/spring-web/src/main/java/org/springframework/web/util/pattern/PathPattern.java index 6493523fa85..45b8776f99d 100644 --- a/spring-web/src/main/java/org/springframework/web/util/pattern/PathPattern.java +++ b/spring-web/src/main/java/org/springframework/web/util/pattern/PathPattern.java @@ -381,7 +381,9 @@ public class PathPattern implements Comparable { // /hotels/* + /booking => /hotels/booking // /hotels/* + booking => /hotels/booking if (this.endsWithSeparatorWildcard) { - return parser.parse(concat(this.patternString.substring(0, this.patternString.length() - 2), pattern2string.patternString)); + return parser.parse(concat( + this.patternString.substring(0, this.patternString.length() - 2), + pattern2string.patternString)); } // /hotels + /booking => /hotels/booking diff --git a/spring-web/src/main/java/org/springframework/web/util/pattern/PatternParseException.java b/spring-web/src/main/java/org/springframework/web/util/pattern/PatternParseException.java index 77e99f57ac8..dbc8c71f646 100644 --- a/spring-web/src/main/java/org/springframework/web/util/pattern/PatternParseException.java +++ b/spring-web/src/main/java/org/springframework/web/util/pattern/PatternParseException.java @@ -98,8 +98,8 @@ public class PatternParseException extends IllegalArgumentException { MISSING_OPEN_CAPTURE("Missing preceeding open capture character before variable name'{'"), ILLEGAL_NESTED_CAPTURE("Not allowed to nest variable captures"), CANNOT_HAVE_ADJACENT_CAPTURES("Adjacent captures are not allowed"), - ILLEGAL_CHARACTER_AT_START_OF_CAPTURE_DESCRIPTOR("Character ''{0}'' is not allowed at start of captured variable name"), - ILLEGAL_CHARACTER_IN_CAPTURE_DESCRIPTOR("Character ''{0}'' is not allowed in a captured variable name"), + ILLEGAL_CHARACTER_AT_START_OF_CAPTURE_DESCRIPTOR("Char ''{0}'' not allowed at start of captured variable name"), + ILLEGAL_CHARACTER_IN_CAPTURE_DESCRIPTOR("Char ''{0}'' is not allowed in a captured variable name"), NO_MORE_DATA_EXPECTED_AFTER_CAPTURE_THE_REST("No more pattern data allowed after '{*...}' pattern element"), BADLY_FORMED_CAPTURE_THE_REST("Expected form when capturing the rest of the path is simply '{*...}'"), MISSING_REGEX_CONSTRAINT("Missing regex constraint on capture"), diff --git a/spring-web/src/main/kotlin/org/springframework/web/client/RestOperationsExtensions.kt b/spring-web/src/main/kotlin/org/springframework/web/client/RestOperationsExtensions.kt index e7cdb9d66ef..c063519c519 100644 --- a/spring-web/src/main/kotlin/org/springframework/web/client/RestOperationsExtensions.kt +++ b/spring-web/src/main/kotlin/org/springframework/web/client/RestOperationsExtensions.kt @@ -25,7 +25,8 @@ import java.net.URI /** - * Extension for [RestOperations.getForObject] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.getForObject] avoiding specifying the type + * parameter thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -36,7 +37,8 @@ inline fun RestOperations.getForObject(url: String, vararg uriV getForObject(url, T::class.java, *uriVariables) /** - * Extension for [RestOperations.getForObject] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.getForObject] avoiding specifying the type + * parameter thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -47,7 +49,8 @@ inline fun RestOperations.getForObject(url: String, uriVariable getForObject(url, T::class.java, uriVariables) /** - * Extension for [RestOperations.getForObject] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.getForObject] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -58,7 +61,8 @@ inline fun RestOperations.getForObject(url: URI): T? = getForObject(url, T::class.java) /** - * Extension for [RestOperations.getForEntity] avoiding requiring the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.getForEntity] avoiding requiring the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -69,7 +73,8 @@ inline fun RestOperations.getForEntity(url: String, vararg uriV getForEntity(url, T::class.java, *uriVariables) /** - * Extension for [RestOperations.postForObject] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.postForObject] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -80,7 +85,8 @@ inline fun RestOperations.postForObject(url: String, request: A postForObject(url, request, T::class.java, *uriVariables) /** - * Extension for [RestOperations.postForObject] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.postForObject] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -91,7 +97,8 @@ inline fun RestOperations.postForObject(url: String, request: A postForObject(url, request, T::class.java, uriVariables) /** - * Extension for [RestOperations.postForObject] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.postForObject] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -102,7 +109,8 @@ inline fun RestOperations.postForObject(url: URI, request: Any) postForObject(url, request, T::class.java) /** - * Extension for [RestOperations.postForEntity] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.postForEntity] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -113,7 +121,8 @@ inline fun RestOperations.postForEntity(url: String, request: A postForEntity(url, request, T::class.java, *uriVariables) /** - * Extension for [RestOperations.postForEntity] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.postForEntity] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -124,7 +133,8 @@ inline fun RestOperations.postForEntity(url: String, request: A postForEntity(url, request, T::class.java, uriVariables) /** - * Extension for [RestOperations.postForEntity] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.postForEntity] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -135,7 +145,8 @@ inline fun RestOperations.postForEntity(url: URI, request: Any) postForEntity(url, request, T::class.java) /** - * Extension for [RestOperations.exchange] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.exchange] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -146,7 +157,8 @@ inline fun RestOperations.exchange(url: String, method: HttpMet exchange(url, method, requestEntity, object : ParameterizedTypeReference() {}, *uriVariables) /** - * Extension for [RestOperations.exchange] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.exchange] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -157,7 +169,8 @@ inline fun RestOperations.exchange(url: String, method: HttpMet exchange(url, method, requestEntity, object : ParameterizedTypeReference() {}, uriVariables) /** - * Extension for [RestOperations.exchange] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.exchange] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze @@ -168,7 +181,8 @@ inline fun RestOperations.exchange(url: URI, method: HttpMethod exchange(url, method, requestEntity, object : ParameterizedTypeReference() {}) /** - * Extension for [RestOperations.exchange] avoiding specifying the type parameter thanks to Kotlin reified type parameters. + * Extension for [RestOperations.exchange] avoiding specifying the type parameter + * thanks to Kotlin reified type parameters. * * @author Jon Schneider * @author Sebastien Deleuze diff --git a/spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java b/spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java index 359e2ac6896..df0662d506e 100644 --- a/spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java +++ b/spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java @@ -81,21 +81,24 @@ public class ContentDispositionTests { @Test public void parseDates() { ContentDisposition disposition = ContentDisposition - .parse("attachment; creation-date=\"Mon, 12 Feb 2007 10:15:30 -0500\"; modification-date=\"Tue, 13 Feb 2007 10:15:30 -0500\"; read-date=\"Wed, 14 Feb 2007 10:15:30 -0500\""); + .parse("attachment; creation-date=\"Mon, 12 Feb 2007 10:15:30 -0500\"; " + + "modification-date=\"Tue, 13 Feb 2007 10:15:30 -0500\"; " + + "read-date=\"Wed, 14 Feb 2007 10:15:30 -0500\""); + DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME; assertEquals(ContentDisposition.builder("attachment") - .creationDate(ZonedDateTime.parse("Mon, 12 Feb 2007 10:15:30 -0500", DateTimeFormatter.RFC_1123_DATE_TIME)) - .modificationDate(ZonedDateTime.parse("Tue, 13 Feb 2007 10:15:30 -0500", DateTimeFormatter.RFC_1123_DATE_TIME)) - .readDate(ZonedDateTime.parse("Wed, 14 Feb 2007 10:15:30 -0500", DateTimeFormatter.RFC_1123_DATE_TIME)) - .build(), disposition); + .creationDate(ZonedDateTime.parse("Mon, 12 Feb 2007 10:15:30 -0500", formatter)) + .modificationDate(ZonedDateTime.parse("Tue, 13 Feb 2007 10:15:30 -0500", formatter)) + .readDate(ZonedDateTime.parse("Wed, 14 Feb 2007 10:15:30 -0500", formatter)).build(), disposition); } @Test public void parseInvalidDates() { ContentDisposition disposition = ContentDisposition - .parse("attachment; creation-date=\"-1\"; modification-date=\"-1\"; read-date=\"Wed, 14 Feb 2007 10:15:30 -0500\""); + .parse("attachment; creation-date=\"-1\"; modification-date=\"-1\"; " + + "read-date=\"Wed, 14 Feb 2007 10:15:30 -0500\""); + DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME; assertEquals(ContentDisposition.builder("attachment") - .readDate(ZonedDateTime.parse("Wed, 14 Feb 2007 10:15:30 -0500", DateTimeFormatter.RFC_1123_DATE_TIME)) - .build(), disposition); + .readDate(ZonedDateTime.parse("Wed, 14 Feb 2007 10:15:30 -0500", formatter)).build(), disposition); } @Test diff --git a/spring-web/src/test/java/org/springframework/http/ResponseEntityTests.java b/spring-web/src/test/java/org/springframework/http/ResponseEntityTests.java index eb4c854d981..07ef76f89ba 100644 --- a/spring-web/src/test/java/org/springframework/http/ResponseEntityTests.java +++ b/spring-web/src/test/java/org/springframework/http/ResponseEntityTests.java @@ -240,7 +240,8 @@ public class ResponseEntityTests { assertTrue(responseEntity.getHeaders().containsKey(HttpHeaders.CACHE_CONTROL)); assertEquals(entity, responseEntity.getBody()); String cacheControlHeader = responseEntity.getHeaders().getCacheControl(); - assertThat(cacheControlHeader, Matchers.equalTo("max-age=3600, must-revalidate, private, proxy-revalidate, s-maxage=1800")); + assertThat(cacheControlHeader, + Matchers.equalTo("max-age=3600, must-revalidate, private, proxy-revalidate, s-maxage=1800")); } @Test diff --git a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java index 5d5c7c03e93..8848412544c 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java @@ -102,7 +102,10 @@ public class Jackson2JsonEncoderTests extends AbstractDataBufferAllocatingTestCa Flux output = this.encoder.encode(source, this.bufferFactory, type, null, emptyMap()); StepVerifier.create(output) - .consumeNextWith(stringConsumer("[{\"foo\":\"foo\",\"bar\":\"bar\"},{\"foo\":\"foofoo\",\"bar\":\"barbar\"},{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}]")) + .consumeNextWith(stringConsumer("[" + + "{\"foo\":\"foo\",\"bar\":\"bar\"}," + + "{\"foo\":\"foofoo\",\"bar\":\"barbar\"}," + + "{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}]")) .verifyComplete(); } diff --git a/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java index aac61b1df73..19eb908d0ca 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java @@ -87,7 +87,8 @@ public class FormHttpMessageConverterTests { public void readForm() throws Exception { String body = "name+1=value+1&name+2=value+2%2B1&name+2=value+2%2B2&name+3"; MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes(StandardCharsets.ISO_8859_1)); - inputMessage.getHeaders().setContentType(new MediaType("application", "x-www-form-urlencoded", StandardCharsets.ISO_8859_1)); + inputMessage.getHeaders().setContentType( + new MediaType("application", "x-www-form-urlencoded", StandardCharsets.ISO_8859_1)); MultiValueMap result = this.converter.read(null, inputMessage); assertEquals("Invalid result", 3, result.size()); diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/GsonHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/GsonHttpMessageConverterTests.java index 7b2723891fb..4142fe60b65 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/GsonHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/GsonHttpMessageConverterTests.java @@ -18,6 +18,7 @@ package org.springframework.http.converter.json; import java.io.IOException; import java.lang.reflect.Field; +import java.lang.reflect.Type; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -156,7 +157,8 @@ public class GsonHttpMessageConverterTests { MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes(StandardCharsets.UTF_8)); inputMessage.getHeaders().setContentType(new MediaType("application", "json")); - List results = (List) converter.read(beansList.getGenericType(), MyBeanListHolder.class, inputMessage); + Type genericType = beansList.getGenericType(); + List results = (List) converter.read(genericType, MyBeanListHolder.class, inputMessage); assertEquals(1, results.size()); MyBean result = results.get(0); assertEquals("Foo", result.getString()); diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java index 23c56d979c4..10991c7939f 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java @@ -73,8 +73,15 @@ import org.junit.Test; import org.springframework.beans.FatalBeanException; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; /** * Test class for {@link Jackson2ObjectMapperBuilder}. @@ -225,16 +232,22 @@ public class Jackson2ObjectMapperBuilderTests { @Test @SuppressWarnings("unchecked") public void modulesToInstallByClass() { - ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modulesToInstall(CustomIntegerModule.class).build(); + ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() + .modulesToInstall(CustomIntegerModule.class) + .build(); Serializers serializers = getSerializerFactoryConfig(objectMapper).serializers().iterator().next(); - assertSame(CustomIntegerSerializer.class, serializers.findSerializer(null, SimpleType.construct(Integer.class), null).getClass()); + assertSame(CustomIntegerSerializer.class, + serializers.findSerializer(null, SimpleType.construct(Integer.class), null).getClass()); } @Test public void modulesToInstallByInstance() { - ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modulesToInstall(new CustomIntegerModule()).build(); + ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() + .modulesToInstall(new CustomIntegerModule()) + .build(); Serializers serializers = getSerializerFactoryConfig(objectMapper).serializers().iterator().next(); - assertSame(CustomIntegerSerializer.class, serializers.findSerializer(null, SimpleType.construct(Integer.class), null).getClass()); + assertSame(CustomIntegerSerializer.class, + serializers.findSerializer(null, SimpleType.construct(Integer.class), null).getClass()); } @Test @@ -257,9 +270,12 @@ public class Jackson2ObjectMapperBuilderTests { } @Test // SPR-12634 - public void customizeWellKnownModulesWithModule() throws JsonProcessingException, UnsupportedEncodingException { + public void customizeWellKnownModulesWithModule() + throws JsonProcessingException, UnsupportedEncodingException { + ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() - .modulesToInstall(new CustomIntegerModule()).build(); + .modulesToInstall(new CustomIntegerModule()) + .build(); DateTime dateTime = new DateTime(1322903730000L, DateTimeZone.UTC); assertEquals("1322903730000", new String(objectMapper.writeValueAsBytes(dateTime), "UTF-8")); assertThat(new String(objectMapper.writeValueAsBytes(new Integer(4)), "UTF-8"), containsString("customid")); @@ -267,15 +283,21 @@ public class Jackson2ObjectMapperBuilderTests { @Test // SPR-12634 @SuppressWarnings("unchecked") - public void customizeWellKnownModulesWithModuleClass() throws JsonProcessingException, UnsupportedEncodingException { - ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modulesToInstall(CustomIntegerModule.class).build(); + public void customizeWellKnownModulesWithModuleClass() + throws JsonProcessingException, UnsupportedEncodingException { + + ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() + .modulesToInstall(CustomIntegerModule.class) + .build(); DateTime dateTime = new DateTime(1322903730000L, DateTimeZone.UTC); assertEquals("1322903730000", new String(objectMapper.writeValueAsBytes(dateTime), "UTF-8")); assertThat(new String(objectMapper.writeValueAsBytes(new Integer(4)), "UTF-8"), containsString("customid")); } @Test // SPR-12634 - public void customizeWellKnownModulesWithSerializer() throws JsonProcessingException, UnsupportedEncodingException { + public void customizeWellKnownModulesWithSerializer() + throws JsonProcessingException, UnsupportedEncodingException { + ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() .serializerByType(Integer.class, new CustomIntegerSerializer()).build(); DateTime dateTime = new DateTime(1322903730000L, DateTimeZone.UTC); @@ -305,7 +327,8 @@ public class Jackson2ObjectMapperBuilderTests { JsonSerializer serializer = new NumberSerializer(Integer.class); ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() .modules(new ArrayList<>()) // Disable well-known modules detection - .serializerByType(Boolean.class, serializer).build(); + .serializerByType(Boolean.class, serializer) + .build(); assertTrue(getSerializerFactoryConfig(objectMapper).hasSerializers()); Serializers serializers = getSerializerFactoryConfig(objectMapper).serializers().iterator().next(); assertSame(serializer, serializers.findSerializer(null, SimpleType.construct(Boolean.class), null)); @@ -316,7 +339,8 @@ public class Jackson2ObjectMapperBuilderTests { JsonDeserializer deserializer = new DateDeserializers.DateDeserializer(); ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() .modules(new ArrayList<>()) // Disable well-known modules detection - .deserializerByType(Date.class, deserializer).build(); + .deserializerByType(Date.class, deserializer) + .build(); assertTrue(getDeserializerFactoryConfig(objectMapper).hasDeserializers()); Deserializers deserializers = getDeserializerFactoryConfig(objectMapper).deserializers().iterator().next(); assertSame(deserializer, deserializers.findBeanDeserializer(SimpleType.construct(Date.class), null, null)); @@ -327,8 +351,9 @@ public class Jackson2ObjectMapperBuilderTests { Class target = String.class; Class mixInSource = Object.class; - ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modules() - .mixIn(target, mixInSource).build(); + ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() + .modules().mixIn(target, mixInSource) + .build(); assertEquals(1, objectMapper.mixInCount()); assertSame(mixInSource, objectMapper.findMixInClassFor(target)); @@ -341,8 +366,9 @@ public class Jackson2ObjectMapperBuilderTests { Map, Class> mixIns = new HashMap<>(); mixIns.put(target, mixInSource); - ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modules() - .mixIns(mixIns).build(); + ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json() + .modules().mixIns(mixIns) + .build(); assertEquals(1, objectMapper.mixInCount()); assertSame(mixInSource, objectMapper.findMixInClassFor(target)); @@ -357,8 +383,10 @@ public class Jackson2ObjectMapperBuilderTests { assertThat(output, containsString("value1")); assertThat(output, containsString("value2")); - objectMapper = Jackson2ObjectMapperBuilder.json().filters((new SimpleFilterProvider().setFailOnUnknownId(false) - .setDefaultFilter(SimpleBeanPropertyFilter.serializeAllExcept("property2")))).build(); + SimpleFilterProvider provider = new SimpleFilterProvider() + .setFailOnUnknownId(false) + .setDefaultFilter(SimpleBeanPropertyFilter.serializeAllExcept("property2")); + objectMapper = Jackson2ObjectMapperBuilder.json().filters(provider).build(); output = objectMapper.writeValueAsString(bean); assertThat(output, containsString("value1")); assertThat(output, not(containsString("value2"))); @@ -378,7 +406,7 @@ public class Jackson2ObjectMapperBuilderTests { Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json() .modules(new ArrayList<>()) // Disable well-known modules detection .serializers(serializer1) - .serializersByType(Collections., JsonSerializer>singletonMap(Boolean.class, serializer2)) + .serializersByType(Collections.singletonMap(Boolean.class, serializer2)) .deserializersByType(deserializerMap) .annotationIntrospector(annotationIntrospector) .featuresToEnable(SerializationFeature.FAIL_ON_EMPTY_BEANS, @@ -391,35 +419,35 @@ public class Jackson2ObjectMapperBuilderTests { JsonGenerator.Feature.QUOTE_FIELD_NAMES) .serializationInclusion(JsonInclude.Include.NON_NULL); - ObjectMapper objectMapper = new ObjectMapper(); - builder.configure(objectMapper); + ObjectMapper mapper = new ObjectMapper(); + builder.configure(mapper); - assertTrue(getSerializerFactoryConfig(objectMapper).hasSerializers()); - assertTrue(getDeserializerFactoryConfig(objectMapper).hasDeserializers()); + assertTrue(getSerializerFactoryConfig(mapper).hasSerializers()); + assertTrue(getDeserializerFactoryConfig(mapper).hasDeserializers()); - Serializers serializers = getSerializerFactoryConfig(objectMapper).serializers().iterator().next(); + Serializers serializers = getSerializerFactoryConfig(mapper).serializers().iterator().next(); assertSame(serializer1, serializers.findSerializer(null, SimpleType.construct(Class.class), null)); assertSame(serializer2, serializers.findSerializer(null, SimpleType.construct(Boolean.class), null)); assertNull(serializers.findSerializer(null, SimpleType.construct(Number.class), null)); - Deserializers deserializers = getDeserializerFactoryConfig(objectMapper).deserializers().iterator().next(); + Deserializers deserializers = getDeserializerFactoryConfig(mapper).deserializers().iterator().next(); assertSame(deserializer, deserializers.findBeanDeserializer(SimpleType.construct(Date.class), null, null)); - assertSame(annotationIntrospector, objectMapper.getSerializationConfig().getAnnotationIntrospector()); - assertSame(annotationIntrospector, objectMapper.getDeserializationConfig().getAnnotationIntrospector()); + assertSame(annotationIntrospector, mapper.getSerializationConfig().getAnnotationIntrospector()); + assertSame(annotationIntrospector, mapper.getDeserializationConfig().getAnnotationIntrospector()); - assertTrue(objectMapper.getSerializationConfig().isEnabled(SerializationFeature.FAIL_ON_EMPTY_BEANS)); - assertTrue(objectMapper.getDeserializationConfig().isEnabled(DeserializationFeature.UNWRAP_ROOT_VALUE)); - assertTrue(objectMapper.getFactory().isEnabled(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER)); - assertTrue(objectMapper.getFactory().isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS)); + assertTrue(mapper.getSerializationConfig().isEnabled(SerializationFeature.FAIL_ON_EMPTY_BEANS)); + assertTrue(mapper.getDeserializationConfig().isEnabled(DeserializationFeature.UNWRAP_ROOT_VALUE)); + assertTrue(mapper.getFactory().isEnabled(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER)); + assertTrue(mapper.getFactory().isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS)); - assertFalse(objectMapper.getSerializationConfig().isEnabled(MapperFeature.AUTO_DETECT_GETTERS)); - assertFalse(objectMapper.getDeserializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)); - assertFalse(objectMapper.getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); - assertFalse(objectMapper.getDeserializationConfig().isEnabled(MapperFeature.AUTO_DETECT_FIELDS)); - assertFalse(objectMapper.getFactory().isEnabled(JsonParser.Feature.AUTO_CLOSE_SOURCE)); - assertFalse(objectMapper.getFactory().isEnabled(JsonGenerator.Feature.QUOTE_FIELD_NAMES)); - assertSame(JsonInclude.Include.NON_NULL, objectMapper.getSerializationConfig().getSerializationInclusion()); + assertFalse(mapper.getSerializationConfig().isEnabled(MapperFeature.AUTO_DETECT_GETTERS)); + assertFalse(mapper.getDeserializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)); + assertFalse(mapper.getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); + assertFalse(mapper.getDeserializationConfig().isEnabled(MapperFeature.AUTO_DETECT_FIELDS)); + assertFalse(mapper.getFactory().isEnabled(JsonParser.Feature.AUTO_CLOSE_SOURCE)); + assertFalse(mapper.getFactory().isEnabled(JsonGenerator.Feature.QUOTE_FIELD_NAMES)); + assertSame(JsonInclude.Include.NON_NULL, mapper.getSerializationConfig().getSerializationInclusion()); } @Test @@ -495,7 +523,9 @@ public class Jackson2ObjectMapperBuilderTests { public static class CustomIntegerSerializer extends JsonSerializer { @Override - public void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + public void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) + throws IOException { + gen.writeStartObject(); gen.writeNumberField("customid", value); gen.writeEndObject(); diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java index 6a8632c7ae6..4763289b343 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/MappingJackson2HttpMessageConverterTests.java @@ -84,8 +84,13 @@ public class MappingJackson2HttpMessageConverterTests { @Test public void readTyped() throws IOException { - String body = - "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}"; + String body = "{" + + "\"bytes\":\"AQI=\"," + + "\"array\":[\"Foo\",\"Bar\"]," + + "\"number\":42," + + "\"string\":\"Foo\"," + + "\"bool\":true," + + "\"fraction\":42.0}"; MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); inputMessage.getHeaders().setContentType(new MediaType("application", "json")); MyBean result = (MyBean) converter.read(MyBean.class, inputMessage); @@ -100,8 +105,13 @@ public class MappingJackson2HttpMessageConverterTests { @Test @SuppressWarnings("unchecked") public void readUntyped() throws IOException { - String body = - "{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}"; + String body = "{" + + "\"bytes\":\"AQI=\"," + + "\"array\":[\"Foo\",\"Bar\"]," + + "\"number\":42," + + "\"string\":\"Foo\"," + + "\"bool\":true," + + "\"fraction\":42.0}"; MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); inputMessage.getHeaders().setContentType(new MediaType("application", "json")); HashMap result = (HashMap) converter.read(HashMap.class, inputMessage); @@ -179,8 +189,13 @@ public class MappingJackson2HttpMessageConverterTests { } } }; - String body = - "[{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}]"; + String body = "[{" + + "\"bytes\":\"AQI=\"," + + "\"array\":[\"Foo\",\"Bar\"]," + + "\"number\":42," + + "\"string\":\"Foo\"," + + "\"bool\":true," + + "\"fraction\":42.0}]"; MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); inputMessage.getHeaders().setContentType(new MediaType("application", "json")); @@ -200,8 +215,13 @@ public class MappingJackson2HttpMessageConverterTests { public void readParameterizedType() throws IOException { ParameterizedTypeReference> beansList = new ParameterizedTypeReference>() {}; - String body = - "[{\"bytes\":\"AQI=\",\"array\":[\"Foo\",\"Bar\"],\"number\":42,\"string\":\"Foo\",\"bool\":true,\"fraction\":42.0}]"; + String body = "[{" + + "\"bytes\":\"AQI=\"," + + "\"array\":[\"Foo\",\"Bar\"]," + + "\"number\":42," + + "\"string\":\"Foo\"," + + "\"bool\":true," + + "\"fraction\":42.0}]"; MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); inputMessage.getHeaders().setContentType(new MediaType("application", "json")); @@ -228,7 +248,8 @@ public class MappingJackson2HttpMessageConverterTests { this.converter.writeInternal(bean, null, outputMessage); String result = outputMessage.getBodyAsString(StandardCharsets.UTF_8); - assertEquals("{" + NEWLINE_SYSTEM_PROPERTY + " \"name\" : \"Jason\"" + NEWLINE_SYSTEM_PROPERTY + "}", result); + assertEquals("{" + NEWLINE_SYSTEM_PROPERTY + + " \"name\" : \"Jason\"" + NEWLINE_SYSTEM_PROPERTY + "}", result); } @Test diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/SpringHandlerInstantiatorTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/SpringHandlerInstantiatorTests.java index 6de4c02ce51..db37c5734c2 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/SpringHandlerInstantiatorTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/SpringHandlerInstantiatorTests.java @@ -136,7 +136,9 @@ public class SpringHandlerInstantiatorTests { private Capitalizer capitalizer; @Override - public void serialize(User user, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + public void serialize(User user, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeStartObject(); jsonGenerator.writeStringField("username", this.capitalizer.capitalize(user.getUsername())); jsonGenerator.writeEndObject(); @@ -150,7 +152,7 @@ public class SpringHandlerInstantiatorTests { private Capitalizer capitalizer; @Override - public Object deserializeKey(String key, DeserializationContext context) throws IOException, JsonProcessingException { + public Object deserializeKey(String key, DeserializationContext context) throws IOException { return this.capitalizer.capitalize(key); } } @@ -164,13 +166,17 @@ public class SpringHandlerInstantiatorTests { public static boolean isAutowiredFiledInitialized = false; @Override - public TypeSerializer buildTypeSerializer(SerializationConfig config, JavaType baseType, Collection subtypes) { + public TypeSerializer buildTypeSerializer(SerializationConfig config, JavaType baseType, + Collection subtypes) { + isAutowiredFiledInitialized = (this.capitalizer != null); return super.buildTypeSerializer(config, baseType, subtypes); } @Override - public TypeDeserializer buildTypeDeserializer(DeserializationConfig config, JavaType baseType, Collection subtypes) { + public TypeDeserializer buildTypeDeserializer(DeserializationConfig config, + JavaType baseType, Collection subtypes) { + return super.buildTypeDeserializer(config, baseType, subtypes); } } diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java index 8e52a8e7058..85bc624befc 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java @@ -82,15 +82,20 @@ public class Jaxb2RootElementHttpMessageConverterTests { @Test public void canRead() throws Exception { - assertTrue("Converter does not support reading @XmlRootElement", converter.canRead(RootElement.class, null)); - assertTrue("Converter does not support reading @XmlType", converter.canRead(Type.class, null)); + assertTrue("Converter does not support reading @XmlRootElement", + converter.canRead(RootElement.class, null)); + assertTrue("Converter does not support reading @XmlType", + converter.canRead(Type.class, null)); } @Test public void canWrite() throws Exception { - assertTrue("Converter does not support writing @XmlRootElement", converter.canWrite(RootElement.class, null)); - assertTrue("Converter does not support writing @XmlRootElement subclass", converter.canWrite(RootElementSubclass.class, null)); - assertTrue("Converter does not support writing @XmlRootElement subclass", converter.canWrite(rootElementCglib.getClass(), null)); + assertTrue("Converter does not support writing @XmlRootElement", + converter.canWrite(RootElement.class, null)); + assertTrue("Converter does not support writing @XmlRootElement subclass", + converter.canWrite(RootElementSubclass.class, null)); + assertTrue("Converter does not support writing @XmlRootElement subclass", + converter.canWrite(rootElementCglib.getClass(), null)); assertFalse("Converter supports writing @XmlType", converter.canWrite(Type.class, null)); } diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java index 66989976dce..f5e7f5be0ca 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java @@ -65,7 +65,14 @@ public class MappingJackson2XmlHttpMessageConverterTests { @Test public void read() throws IOException { - String body = "Foo4242.0FooBartrueAQI="; + String body = "" + + "Foo" + + "42" + + "42.0" + + "Foo" + + "Bar" + + "true" + + "AQI="; MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8")); inputMessage.getHeaders().setContentType(new MediaType("application", "xml")); MyBean result = (MyBean) converter.read(MyBean.class, inputMessage); diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockExpressionEvaluator.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockExpressionEvaluator.java index ace4928ce28..5fdbb3deaa0 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/MockExpressionEvaluator.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockExpressionEvaluator.java @@ -57,7 +57,9 @@ public class MockExpressionEvaluator extends javax.servlet.jsp.el.ExpressionEval return new javax.servlet.jsp.el.Expression() { @Override - public Object evaluate(javax.servlet.jsp.el.VariableResolver variableResolver) throws javax.servlet.jsp.el.ELException { + public Object evaluate(javax.servlet.jsp.el.VariableResolver variableResolver) + throws javax.servlet.jsp.el.ELException { + return doEvaluate(expression, expectedType, functionMapper); } }; @@ -65,7 +67,8 @@ public class MockExpressionEvaluator extends javax.servlet.jsp.el.ExpressionEval @Override @SuppressWarnings("rawtypes") - public Object evaluate(String expression, Class expectedType, javax.servlet.jsp.el.VariableResolver variableResolver, + public Object evaluate(String expression, Class expectedType, + javax.servlet.jsp.el.VariableResolver variableResolver, javax.servlet.jsp.el.FunctionMapper functionMapper) throws javax.servlet.jsp.el.ELException { Assert.isNull(variableResolver, "Custom VariableResolver not supported"); @@ -73,15 +76,17 @@ public class MockExpressionEvaluator extends javax.servlet.jsp.el.ExpressionEval } @SuppressWarnings("rawtypes") - protected Object doEvaluate(String expression, Class expectedType, javax.servlet.jsp.el.FunctionMapper functionMapper) - throws javax.servlet.jsp.el.ELException { + protected Object doEvaluate(String expression, Class expectedType, + javax.servlet.jsp.el.FunctionMapper functionMapper) throws javax.servlet.jsp.el.ELException { Assert.isNull(functionMapper, "Custom FunctionMapper not supported"); try { - return ExpressionEvaluatorManager.evaluate("JSP EL expression", expression, expectedType, this.pageContext); + return ExpressionEvaluatorManager.evaluate( + "JSP EL expression", expression, expectedType, this.pageContext); } catch (JspException ex) { - throw new javax.servlet.jsp.el.ELException("Parsing of JSP EL expression \"" + expression + "\" failed", ex); + throw new javax.servlet.jsp.el.ELException( + "Parsing of JSP EL expression \"" + expression + "\" failed", ex); } } diff --git a/spring-web/src/test/java/org/springframework/protobuf/Msg.java b/spring-web/src/test/java/org/springframework/protobuf/Msg.java index 20547ce7228..11f8a13be0f 100644 --- a/spring-web/src/test/java/org/springframework/protobuf/Msg.java +++ b/spring-web/src/test/java/org/springframework/protobuf/Msg.java @@ -526,7 +526,8 @@ public final class Msg extends // optional .SecondMsg blah = 2; private org.springframework.protobuf.SecondMsg blah_ = org.springframework.protobuf.SecondMsg.getDefaultInstance(); private com.google.protobuf.SingleFieldBuilder< - org.springframework.protobuf.SecondMsg, org.springframework.protobuf.SecondMsg.Builder, org.springframework.protobuf.SecondMsgOrBuilder> blahBuilder_; + org.springframework.protobuf.SecondMsg, org.springframework.protobuf.SecondMsg.Builder, + org.springframework.protobuf.SecondMsgOrBuilder> blahBuilder_; /** * optional .SecondMsg blah = 2; */ @@ -627,7 +628,8 @@ public final class Msg extends * optional .SecondMsg blah = 2; */ private com.google.protobuf.SingleFieldBuilder< - org.springframework.protobuf.SecondMsg, org.springframework.protobuf.SecondMsg.Builder, org.springframework.protobuf.SecondMsgOrBuilder> + org.springframework.protobuf.SecondMsg, org.springframework.protobuf.SecondMsg.Builder, + org.springframework.protobuf.SecondMsgOrBuilder> getBlahFieldBuilder() { if (blahBuilder_ == null) { blahBuilder_ = new com.google.protobuf.SingleFieldBuilder<>( diff --git a/spring-web/src/test/java/org/springframework/remoting/jaxws/OrderServiceImpl.java b/spring-web/src/test/java/org/springframework/remoting/jaxws/OrderServiceImpl.java index b109cdcd6da..ea9476965cc 100644 --- a/spring-web/src/test/java/org/springframework/remoting/jaxws/OrderServiceImpl.java +++ b/spring-web/src/test/java/org/springframework/remoting/jaxws/OrderServiceImpl.java @@ -25,7 +25,8 @@ import org.springframework.util.Assert; /** * @author Juergen Hoeller */ -@WebService(serviceName="OrderService", portName="OrderService", endpointInterface = "org.springframework.remoting.jaxws.OrderService") +@WebService(serviceName="OrderService", portName="OrderService", + endpointInterface = "org.springframework.remoting.jaxws.OrderService") public class OrderServiceImpl implements OrderService { @Resource diff --git a/spring-web/src/test/java/org/springframework/web/bind/EscapedErrorsTests.java b/spring-web/src/test/java/org/springframework/web/bind/EscapedErrorsTests.java index 25d63e8b3a9..e609dabf8dc 100644 --- a/spring-web/src/test/java/org/springframework/web/bind/EscapedErrorsTests.java +++ b/spring-web/src/test/java/org/springframework/web/bind/EscapedErrorsTests.java @@ -50,12 +50,13 @@ public class EscapedErrorsTests { assertTrue("Correct global errors flag", errors.hasGlobalErrors()); assertTrue("Correct number of global errors", errors.getGlobalErrorCount() == 1); ObjectError globalError = errors.getGlobalError(); - assertTrue("Global error message escaped", "message: " '".equals(globalError.getDefaultMessage())); + String defaultMessage = globalError.getDefaultMessage(); + assertTrue("Global error message escaped", "message: " '".equals(defaultMessage)); assertTrue("Global error code not escaped", "GENERAL_ERROR \" '".equals(globalError.getCode())); ObjectError globalErrorInList = errors.getGlobalErrors().get(0); - assertTrue("Same global error in list", globalError.getDefaultMessage().equals(globalErrorInList.getDefaultMessage())); + assertTrue("Same global error in list", defaultMessage.equals(globalErrorInList.getDefaultMessage())); ObjectError globalErrorInAllList = errors.getAllErrors().get(3); - assertTrue("Same global error in list", globalError.getDefaultMessage().equals(globalErrorInAllList.getDefaultMessage())); + assertTrue("Same global error in list", defaultMessage.equals(globalErrorInAllList.getDefaultMessage())); assertTrue("Correct field errors flag", errors.hasFieldErrors()); assertTrue("Correct number of field errors", errors.getFieldErrorCount() == 3); diff --git a/spring-web/src/test/java/org/springframework/web/client/RestTemplateIntegrationTests.java b/spring-web/src/test/java/org/springframework/web/client/RestTemplateIntegrationTests.java index d7954299c2b..e885dec8961 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestTemplateIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestTemplateIntegrationTests.java @@ -58,6 +58,7 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import static org.junit.Assert.*; +import static org.springframework.http.HttpMethod.POST; /** * @author Arjen Poutsma @@ -248,8 +249,8 @@ public class RestTemplateIntegrationTests extends AbstractMockWebServerTestCase HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.set("MyHeader", "MyValue"); requestHeaders.setContentType(MediaType.TEXT_PLAIN); - HttpEntity requestEntity = new HttpEntity<>(helloWorld, requestHeaders); - HttpEntity result = template.exchange(baseUrl + "/{method}", HttpMethod.POST, requestEntity, Void.class, "post"); + HttpEntity entity = new HttpEntity<>(helloWorld, requestHeaders); + HttpEntity result = template.exchange(baseUrl + "/{method}", POST, entity, Void.class, "post"); assertEquals("Invalid location", new URI(baseUrl + "/post/1"), result.getHeaders().getLocation()); assertFalse(result.hasBody()); } diff --git a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java index a96e677106e..e07fa329fc5 100644 --- a/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/RestTemplateTests.java @@ -47,6 +47,7 @@ import org.springframework.web.util.DefaultUriBuilderFactory; import static org.junit.Assert.*; import static org.mockito.BDDMockito.*; +import static org.springframework.http.HttpMethod.POST; import static org.springframework.http.MediaType.*; /** @@ -326,7 +327,7 @@ public class RestTemplateTests { @Test public void postForLocation() throws Exception { - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(request); String helloWorld = "Hello World"; given(converter.canWrite(String.class, null)).willReturn(true); converter.write(helloWorld, null, request); @@ -348,7 +349,7 @@ public class RestTemplateTests { @Test public void postForLocationEntityContentType() throws Exception { - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(request); String helloWorld = "Hello World"; MediaType contentType = MediaType.TEXT_PLAIN; given(converter.canWrite(String.class, contentType)).willReturn(true); @@ -377,7 +378,7 @@ public class RestTemplateTests { @Test public void postForLocationEntityCustomHeader() throws Exception { - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(request); String helloWorld = "Hello World"; given(converter.canWrite(String.class, null)).willReturn(true); HttpHeaders requestHeaders = new HttpHeaders(); @@ -406,7 +407,7 @@ public class RestTemplateTests { @Test public void postForLocationNoLocation() throws Exception { - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(request); String helloWorld = "Hello World"; given(converter.canWrite(String.class, null)).willReturn(true); converter.write(helloWorld, null, request); @@ -426,7 +427,7 @@ public class RestTemplateTests { @Test public void postForLocationNull() throws Exception { - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(request); HttpHeaders requestHeaders = new HttpHeaders(); given(request.getHeaders()).willReturn(requestHeaders); given(request.execute()).willReturn(response); @@ -448,7 +449,7 @@ public class RestTemplateTests { MediaType textPlain = new MediaType("text", "plain"); given(converter.canRead(Integer.class, null)).willReturn(true); given(converter.getSupportedMediaTypes()).willReturn(Collections.singletonList(textPlain)); - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(this.request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(this.request); HttpHeaders requestHeaders = new HttpHeaders(); given(this.request.getHeaders()).willReturn(requestHeaders); String request = "Hello World"; @@ -481,7 +482,7 @@ public class RestTemplateTests { MediaType textPlain = new MediaType("text", "plain"); given(converter.canRead(Integer.class, null)).willReturn(true); given(converter.getSupportedMediaTypes()).willReturn(Collections.singletonList(textPlain)); - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(this.request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(this.request); HttpHeaders requestHeaders = new HttpHeaders(); given(this.request.getHeaders()).willReturn(requestHeaders); String request = "Hello World"; @@ -514,7 +515,7 @@ public class RestTemplateTests { MediaType textPlain = new MediaType("text", "plain"); given(converter.canRead(Integer.class, null)).willReturn(true); given(converter.getSupportedMediaTypes()).willReturn(Collections.singletonList(textPlain)); - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(request); HttpHeaders requestHeaders = new HttpHeaders(); given(request.getHeaders()).willReturn(requestHeaders); given(request.execute()).willReturn(response); @@ -543,7 +544,7 @@ public class RestTemplateTests { MediaType textPlain = new MediaType("text", "plain"); given(converter.canRead(Integer.class, null)).willReturn(true); given(converter.getSupportedMediaTypes()).willReturn(Collections.singletonList(textPlain)); - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(request); HttpHeaders requestHeaders = new HttpHeaders(); given(request.getHeaders()).willReturn(requestHeaders); given(request.execute()).willReturn(response); @@ -685,7 +686,7 @@ public class RestTemplateTests { given(request.execute()).willReturn(response); given(errorHandler.hasError(response)).willReturn(false); HttpHeaders responseHeaders = new HttpHeaders(); - EnumSet expected = EnumSet.of(HttpMethod.GET, HttpMethod.POST); + EnumSet expected = EnumSet.of(HttpMethod.GET, POST); responseHeaders.setAllow(expected); given(response.getHeaders()).willReturn(responseHeaders); HttpStatus status = HttpStatus.OK; @@ -747,7 +748,7 @@ public class RestTemplateTests { public void exchange() throws Exception { given(converter.canRead(Integer.class, null)).willReturn(true); given(converter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN)); - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(this.request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(this.request); HttpHeaders requestHeaders = new HttpHeaders(); given(this.request.getHeaders()).willReturn(requestHeaders); given(converter.canWrite(String.class, null)).willReturn(true); @@ -769,8 +770,8 @@ public class RestTemplateTests { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.set("MyHeader", "MyValue"); - HttpEntity requestEntity = new HttpEntity<>(body, entityHeaders); - ResponseEntity result = template.exchange("http://example.com", HttpMethod.POST, requestEntity, Integer.class); + HttpEntity entity = new HttpEntity<>(body, entityHeaders); + ResponseEntity result = template.exchange("http://example.com", POST, entity, Integer.class); assertEquals("Invalid POST result", expected, result.getBody()); assertEquals("Invalid Content-Type", MediaType.TEXT_PLAIN, result.getHeaders().getContentType()); assertEquals("Invalid Accept header", MediaType.TEXT_PLAIN_VALUE, requestHeaders.getFirst("Accept")); @@ -789,7 +790,7 @@ public class RestTemplateTests { ParameterizedTypeReference> intList = new ParameterizedTypeReference>() {}; given(converter.canRead(intList.getType(), null, null)).willReturn(true); given(converter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN)); - given(requestFactory.createRequest(new URI("http://example.com"), HttpMethod.POST)).willReturn(this.request); + given(requestFactory.createRequest(new URI("http://example.com"), POST)).willReturn(this.request); HttpHeaders requestHeaders = new HttpHeaders(); given(this.request.getHeaders()).willReturn(requestHeaders); given(converter.canWrite(String.class, String.class, null)).willReturn(true); @@ -811,7 +812,7 @@ public class RestTemplateTests { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.set("MyHeader", "MyValue"); HttpEntity requestEntity = new HttpEntity<>(requestBody, entityHeaders); - ResponseEntity> result = template.exchange("http://example.com", HttpMethod.POST, requestEntity, intList); + ResponseEntity> result = template.exchange("http://example.com", POST, requestEntity, intList); assertEquals("Invalid POST result", expected, result.getBody()); assertEquals("Invalid Content-Type", MediaType.TEXT_PLAIN, result.getHeaders().getContentType()); assertEquals("Invalid Accept header", MediaType.TEXT_PLAIN_VALUE, requestHeaders.getFirst("Accept")); diff --git a/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java b/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java index c7e5b145800..ae0a9dfdee4 100644 --- a/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java +++ b/spring-web/src/test/java/org/springframework/web/context/request/ServletWebRequestHttpMethodsTests.java @@ -126,7 +126,8 @@ public class ServletWebRequestHttpMethodsTests { assertTrue(request.checkNotModified(epochTime)); assertEquals(304, servletResponse.getStatus()); - assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), servletResponse.getHeader("Last-Modified")); + assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), + servletResponse.getHeader("Last-Modified")); } @Test @@ -137,7 +138,8 @@ public class ServletWebRequestHttpMethodsTests { assertFalse(request.checkNotModified(currentDate.getTime())); assertEquals(200, servletResponse.getStatus()); - assertEquals(RFC_1123_DATE_TIME.format(currentDate.toInstant().atZone(GMT)), servletResponse.getHeader("Last-Modified")); + assertEquals(RFC_1123_DATE_TIME.format(currentDate.toInstant().atZone(GMT)), + servletResponse.getHeader("Last-Modified")); } @Test @@ -220,7 +222,8 @@ public class ServletWebRequestHttpMethodsTests { assertEquals(304, servletResponse.getStatus()); assertEquals(eTag, servletResponse.getHeader("ETag")); - assertEquals(RFC_1123_DATE_TIME.format(currentDate.toInstant().atZone(GMT)), servletResponse.getHeader("Last-Modified")); + assertEquals(RFC_1123_DATE_TIME.format(currentDate.toInstant().atZone(GMT)), + servletResponse.getHeader("Last-Modified")); } @Test // SPR-14224 @@ -235,7 +238,8 @@ public class ServletWebRequestHttpMethodsTests { assertEquals(304, servletResponse.getStatus()); assertEquals(eTag, servletResponse.getHeader("ETag")); - assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(currentEpoch).atZone(GMT)), servletResponse.getHeader("Last-Modified")); + assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(currentEpoch).atZone(GMT)), + servletResponse.getHeader("Last-Modified")); } @Test @@ -250,7 +254,8 @@ public class ServletWebRequestHttpMethodsTests { assertEquals(200, servletResponse.getStatus()); assertEquals(currentETag, servletResponse.getHeader("ETag")); - assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), servletResponse.getHeader("Last-Modified")); + assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), + servletResponse.getHeader("Last-Modified")); } @Test @@ -297,7 +302,8 @@ public class ServletWebRequestHttpMethodsTests { assertTrue(request.checkNotModified(epochTime)); assertEquals(304, servletResponse.getStatus()); - assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), servletResponse.getHeader("Last-Modified")); + assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), + servletResponse.getHeader("Last-Modified")); } @Test @@ -309,7 +315,8 @@ public class ServletWebRequestHttpMethodsTests { assertFalse(request.checkNotModified(epochTime)); assertEquals(200, servletResponse.getStatus()); - assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), servletResponse.getHeader("Last-Modified")); + assertEquals(RFC_1123_DATE_TIME.format(Instant.ofEpochMilli(epochTime).atZone(GMT)), + servletResponse.getHeader("Last-Modified")); } @Test diff --git a/spring-web/src/test/java/org/springframework/web/context/support/StandardServletEnvironmentTests.java b/spring-web/src/test/java/org/springframework/web/context/support/StandardServletEnvironmentTests.java index e36ebcc685d..63aa1da292a 100644 --- a/spring-web/src/test/java/org/springframework/web/context/support/StandardServletEnvironmentTests.java +++ b/spring-web/src/test/java/org/springframework/web/context/support/StandardServletEnvironmentTests.java @@ -42,11 +42,16 @@ public class StandardServletEnvironmentTests { ConfigurableEnvironment env = new StandardServletEnvironment(); MutablePropertySources sources = env.getPropertySources(); - assertThat(sources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)), equalTo(0)); - assertThat(sources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)), equalTo(1)); - assertThat(sources.precedenceOf(PropertySource.named(StandardServletEnvironment.JNDI_PROPERTY_SOURCE_NAME)), equalTo(2)); - assertThat(sources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME)), equalTo(3)); - assertThat(sources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME)), equalTo(4)); + assertThat(sources.precedenceOf(PropertySource.named( + StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)), equalTo(0)); + assertThat(sources.precedenceOf(PropertySource.named( + StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)), equalTo(1)); + assertThat(sources.precedenceOf(PropertySource.named( + StandardServletEnvironment.JNDI_PROPERTY_SOURCE_NAME)), equalTo(2)); + assertThat(sources.precedenceOf(PropertySource.named( + StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME)), equalTo(3)); + assertThat(sources.precedenceOf(PropertySource.named( + StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME)), equalTo(4)); assertThat(sources.size(), is(5)); } diff --git a/spring-web/src/test/java/org/springframework/web/cors/CorsConfigurationTests.java b/spring-web/src/test/java/org/springframework/web/cors/CorsConfigurationTests.java index a7c54566b08..e7147d99c0b 100644 --- a/spring-web/src/test/java/org/springframework/web/cors/CorsConfigurationTests.java +++ b/spring-web/src/test/java/org/springframework/web/cors/CorsConfigurationTests.java @@ -232,8 +232,10 @@ public class CorsConfigurationTests { config.addAllowedHeader("header1"); config.addAllowedHeader("header2"); assertEquals(Arrays.asList("header1"), config.checkHeaders(Arrays.asList("header1"))); - assertEquals(Arrays.asList("header1", "header2"), config.checkHeaders(Arrays.asList("header1", "header2"))); - assertEquals(Arrays.asList("header1", "header2"), config.checkHeaders(Arrays.asList("header1", "header2", "header3"))); + assertEquals(Arrays.asList("header1", "header2"), + config.checkHeaders(Arrays.asList("header1", "header2"))); + assertEquals(Arrays.asList("header1", "header2"), + config.checkHeaders(Arrays.asList("header1", "header2", "header3"))); } @Test diff --git a/spring-web/src/test/java/org/springframework/web/cors/UrlBasedCorsConfigurationSourceTests.java b/spring-web/src/test/java/org/springframework/web/cors/UrlBasedCorsConfigurationSourceTests.java index 2d6aaa49458..960c442b18e 100644 --- a/spring-web/src/test/java/org/springframework/web/cors/UrlBasedCorsConfigurationSourceTests.java +++ b/spring-web/src/test/java/org/springframework/web/cors/UrlBasedCorsConfigurationSourceTests.java @@ -32,15 +32,20 @@ public class UrlBasedCorsConfigurationSourceTests { @Test public void empty() { - assertNull(this.configSource.getCorsConfiguration(new MockHttpServletRequest(HttpMethod.GET.name(), "/bar/test.html"))); + MockHttpServletRequest request = new MockHttpServletRequest(HttpMethod.GET.name(), "/bar/test.html"); + assertNull(this.configSource.getCorsConfiguration(request)); } @Test public void registerAndMatch() { CorsConfiguration config = new CorsConfiguration(); this.configSource.registerCorsConfiguration("/bar/**", config); - assertNull(this.configSource.getCorsConfiguration(new MockHttpServletRequest(HttpMethod.GET.name(), "/foo/test.html"))); - assertEquals(config, this.configSource.getCorsConfiguration(new MockHttpServletRequest(HttpMethod.GET.name(), "/bar/test.html"))); + + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo/test.html"); + assertNull(this.configSource.getCorsConfiguration(request)); + + request.setRequestURI("/bar/test.html"); + assertEquals(config, this.configSource.getCorsConfiguration(request)); } @Test(expected = UnsupportedOperationException.class) diff --git a/spring-web/src/test/java/org/springframework/web/filter/CharacterEncodingFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/CharacterEncodingFilterTests.java index 5f0006c9ef6..6efedf0c30d 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/CharacterEncodingFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/CharacterEncodingFilterTests.java @@ -46,7 +46,7 @@ public class CharacterEncodingFilterTests { HttpServletRequest request = mock(HttpServletRequest.class); request.setCharacterEncoding(ENCODING); given(request.getAttribute(WebUtils.ERROR_REQUEST_URI_ATTRIBUTE)).willReturn(null); - given(request.getAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX)).willReturn(null); + given(request.getAttribute(filteredName(FILTER_NAME))).willReturn(null); HttpServletResponse response = mock(HttpServletResponse.class); FilterChain filterChain = mock(FilterChain.class); @@ -55,8 +55,8 @@ public class CharacterEncodingFilterTests { filter.init(new MockFilterConfig(FILTER_NAME)); filter.doFilter(request, response, filterChain); - verify(request).setAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, Boolean.TRUE); - verify(request).removeAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX); + verify(request).setAttribute(filteredName(FILTER_NAME), Boolean.TRUE); + verify(request).removeAttribute(filteredName(FILTER_NAME)); verify(response).setCharacterEncoding(ENCODING); verify(filterChain).doFilter(request, response); } @@ -66,7 +66,7 @@ public class CharacterEncodingFilterTests { HttpServletRequest request = mock(HttpServletRequest.class); given(request.getCharacterEncoding()).willReturn(null); given(request.getAttribute(WebUtils.ERROR_REQUEST_URI_ATTRIBUTE)).willReturn(null); - given(request.getAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX)).willReturn(null); + given(request.getAttribute(filteredName(FILTER_NAME))).willReturn(null); MockHttpServletResponse response = new MockHttpServletResponse(); @@ -77,8 +77,8 @@ public class CharacterEncodingFilterTests { filter.doFilter(request, response, filterChain); verify(request).setCharacterEncoding(ENCODING); - verify(request).setAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, Boolean.TRUE); - verify(request).removeAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX); + verify(request).setAttribute(filteredName(FILTER_NAME), Boolean.TRUE); + verify(request).removeAttribute(filteredName(FILTER_NAME)); verify(filterChain).doFilter(request, response); } @@ -87,7 +87,7 @@ public class CharacterEncodingFilterTests { HttpServletRequest request = mock(HttpServletRequest.class); given(request.getCharacterEncoding()).willReturn(ENCODING); given(request.getAttribute(WebUtils.ERROR_REQUEST_URI_ATTRIBUTE)).willReturn(null); - given(request.getAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX)).willReturn(null); + given(request.getAttribute(filteredName(FILTER_NAME))).willReturn(null); MockHttpServletResponse response = new MockHttpServletResponse(); @@ -97,8 +97,8 @@ public class CharacterEncodingFilterTests { filter.init(new MockFilterConfig(FILTER_NAME)); filter.doFilter(request, response, filterChain); - verify(request).setAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, Boolean.TRUE); - verify(request).removeAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX); + verify(request).setAttribute(filteredName(FILTER_NAME), Boolean.TRUE); + verify(request).removeAttribute(filteredName(FILTER_NAME)); verify(filterChain).doFilter(request, response); } @@ -107,7 +107,7 @@ public class CharacterEncodingFilterTests { HttpServletRequest request = mock(HttpServletRequest.class); given(request.getCharacterEncoding()).willReturn(null); given(request.getAttribute(WebUtils.ERROR_REQUEST_URI_ATTRIBUTE)).willReturn(null); - given(request.getAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX)).willReturn(null); + given(request.getAttribute(filteredName(FILTER_NAME))).willReturn(null); MockHttpServletResponse response = new MockHttpServletResponse(); @@ -120,8 +120,8 @@ public class CharacterEncodingFilterTests { filter.doFilter(request, response, filterChain); verify(request).setCharacterEncoding(ENCODING); - verify(request).setAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, Boolean.TRUE); - verify(request).removeAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX); + verify(request).setAttribute(filteredName(FILTER_NAME), Boolean.TRUE); + verify(request).removeAttribute(filteredName(FILTER_NAME)); verify(filterChain).doFilter(request, response); } @@ -130,7 +130,7 @@ public class CharacterEncodingFilterTests { HttpServletRequest request = mock(HttpServletRequest.class); given(request.getCharacterEncoding()).willReturn(null); given(request.getAttribute(WebUtils.ERROR_REQUEST_URI_ATTRIBUTE)).willReturn(null); - given(request.getAttribute(CharacterEncodingFilter.class.getName() + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX)).willReturn(null); + given(request.getAttribute(filteredName(CharacterEncodingFilter.class.getName()))).willReturn(null); MockHttpServletResponse response = new MockHttpServletResponse(); @@ -140,8 +140,8 @@ public class CharacterEncodingFilterTests { filter.doFilter(request, response, filterChain); verify(request).setCharacterEncoding(ENCODING); - verify(request).setAttribute(CharacterEncodingFilter.class.getName() + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, Boolean.TRUE); - verify(request).removeAttribute(CharacterEncodingFilter.class.getName() + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX); + verify(request).setAttribute(filteredName(CharacterEncodingFilter.class.getName()), Boolean.TRUE); + verify(request).removeAttribute(filteredName(CharacterEncodingFilter.class.getName())); verify(filterChain).doFilter(request, response); } @@ -151,7 +151,7 @@ public class CharacterEncodingFilterTests { HttpServletRequest request = mock(HttpServletRequest.class); request.setCharacterEncoding(ENCODING); given(request.getAttribute(WebUtils.ERROR_REQUEST_URI_ATTRIBUTE)).willReturn(null); - given(request.getAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX)).willReturn(null); + given(request.getAttribute(filteredName(FILTER_NAME))).willReturn(null); HttpServletResponse response = mock(HttpServletResponse.class); FilterChain filterChain = mock(FilterChain.class); @@ -160,11 +160,15 @@ public class CharacterEncodingFilterTests { filter.init(new MockFilterConfig(FILTER_NAME)); filter.doFilter(request, response, filterChain); - verify(request).setAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, Boolean.TRUE); - verify(request).removeAttribute(FILTER_NAME + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX); + verify(request).setAttribute(filteredName(FILTER_NAME), Boolean.TRUE); + verify(request).removeAttribute(filteredName(FILTER_NAME)); verify(request, times(2)).setCharacterEncoding(ENCODING); verify(response, never()).setCharacterEncoding(ENCODING); verify(filterChain).doFilter(request, response); } + private String filteredName(String prefix) { + return prefix + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX; + } + } diff --git a/spring-web/src/test/java/org/springframework/web/filter/DelegatingFilterProxyTests.java b/spring-web/src/test/java/org/springframework/web/filter/DelegatingFilterProxyTests.java index 570c192f218..f5ff37cad9d 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/DelegatingFilterProxyTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/DelegatingFilterProxyTests.java @@ -146,7 +146,9 @@ public class DelegatingFilterProxyTests { } @Test - public void testDelegatingFilterProxyWithTargetBeanNameAndNotYetRefreshedApplicationContext() throws ServletException, IOException { + public void testDelegatingFilterProxyWithTargetBeanNameAndNotYetRefreshedApplicationContext() + throws ServletException, IOException { + MockServletContext sc = new MockServletContext(); StaticWebApplicationContext wac = new StaticWebApplicationContext(); @@ -172,7 +174,9 @@ public class DelegatingFilterProxyTests { } @Test(expected = IllegalStateException.class) - public void testDelegatingFilterProxyWithTargetBeanNameAndNoApplicationContext() throws ServletException, IOException { + public void testDelegatingFilterProxyWithTargetBeanNameAndNoApplicationContext() + throws ServletException, IOException { + MockServletContext sc = new MockServletContext(); DelegatingFilterProxy filterProxy = new DelegatingFilterProxy("targetFilter", null); @@ -325,7 +329,9 @@ public class DelegatingFilterProxyTests { } @Test - public void testDelegatingFilterProxyNotInjectedWacServletAttrPreferred() throws ServletException, IOException { + public void testDelegatingFilterProxyNotInjectedWacServletAttrPreferred() + throws ServletException, IOException { + ServletContext sc = new MockServletContext(); StaticWebApplicationContext wac = new StaticWebApplicationContext(); wac.setServletContext(sc); @@ -401,7 +407,9 @@ public class DelegatingFilterProxyTests { } @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + request.setAttribute("called", Boolean.TRUE); } diff --git a/spring-web/src/test/java/org/springframework/web/jsf/DelegatingNavigationHandlerTests.java b/spring-web/src/test/java/org/springframework/web/jsf/DelegatingNavigationHandlerTests.java index b178b950b01..a3129f90877 100644 --- a/spring-web/src/test/java/org/springframework/web/jsf/DelegatingNavigationHandlerTests.java +++ b/spring-web/src/test/java/org/springframework/web/jsf/DelegatingNavigationHandlerTests.java @@ -91,8 +91,9 @@ public class DelegatingNavigationHandlerTests { private String lastOutcome; @Override - public void handleNavigation( - FacesContext facesContext, @Nullable String fromAction, @Nullable String outcome, @Nullable NavigationHandler originalNavigationHandler) { + public void handleNavigation(FacesContext facesContext, @Nullable String fromAction, + @Nullable String outcome, @Nullable NavigationHandler originalNavigationHandler) { + lastFromAction = fromAction; lastOutcome = outcome; if (originalNavigationHandler != null) { diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java index 9bb49957235..6a00ff56128 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java @@ -49,7 +49,9 @@ public class UriComponentsBuilderTests { @Test public void plain() throws URISyntaxException { UriComponentsBuilder builder = UriComponentsBuilder.newInstance(); - UriComponents result = builder.scheme("http").host("example.com").path("foo").queryParam("bar").fragment("baz").build(); + UriComponents result = builder.scheme("http").host("example.com") + .path("foo").queryParam("bar").fragment("baz") + .build(); assertEquals("http", result.getScheme()); assertEquals("example.com", result.getHost()); assertEquals("foo", result.getPath()); @@ -62,7 +64,8 @@ public class UriComponentsBuilderTests { @Test public void multipleFromSameBuilder() throws URISyntaxException { - UriComponentsBuilder builder = UriComponentsBuilder.newInstance().scheme("http").host("example.com").pathSegment("foo"); + UriComponentsBuilder builder = UriComponentsBuilder.newInstance() + .scheme("http").host("example.com").pathSegment("foo"); UriComponents result1 = builder.build(); builder = builder.pathSegment("foo2").queryParam("bar").fragment("baz"); UriComponents result2 = builder.build(); @@ -129,7 +132,8 @@ public class UriComponentsBuilderTests { public void fromUriEncodedQuery() throws URISyntaxException { URI uri = new URI("http://www.example.org/?param=aGVsbG9Xb3JsZA%3D%3D"); String fromUri = UriComponentsBuilder.fromUri(uri).build().getQueryParams().get("param").get(0); - String fromUriString = UriComponentsBuilder.fromUriString(uri.toString()).build().getQueryParams().get("param").get(0); + String fromUriString = UriComponentsBuilder.fromUriString(uri.toString()) + .build().getQueryParams().get("param").get(0); assertEquals(fromUri, fromUriString); } @@ -146,9 +150,9 @@ public class UriComponentsBuilderTests { assertNull(result.getQuery()); assertNull(result.getFragment()); - result = UriComponentsBuilder.fromUriString( - "http://arjen:foobar@java.sun.com:80/javase/6/docs/api/java/util/BitSet.html?foo=bar#and(java.util.BitSet)") - .build(); + String url = "http://arjen:foobar@java.sun.com:80" + + "/javase/6/docs/api/java/util/BitSet.html?foo=bar#and(java.util.BitSet)"; + result = UriComponentsBuilder.fromUriString(url).build(); assertEquals("http", result.getScheme()); assertEquals("arjen:foobar", result.getUserInfo()); assertEquals("java.sun.com", result.getHost()); @@ -635,7 +639,8 @@ public class UriComponentsBuilderTests { @Test public void buildAndExpandOpaque() { - UriComponents result = UriComponentsBuilder.fromUriString("mailto:{user}@{domain}").buildAndExpand("foo", "example.com"); + UriComponents result = UriComponentsBuilder.fromUriString("mailto:{user}@{domain}") + .buildAndExpand("foo", "example.com"); assertEquals("mailto:foo@example.com", result.toUriString()); Map values = new HashMap<>(); @@ -670,23 +675,38 @@ public class UriComponentsBuilderTests { @Test public void relativeUrls() throws Exception { - assertThat(UriComponentsBuilder.fromUriString("http://example.com/foo/../bar").build().toString(), equalTo("http://example.com/foo/../bar")); - assertThat(UriComponentsBuilder.fromUriString("http://example.com/foo/../bar").build().toUriString(), equalTo("http://example.com/foo/../bar")); - assertThat(UriComponentsBuilder.fromUriString("http://example.com/foo/../bar").build().toUri().getPath(), equalTo("/foo/../bar")); - assertThat(UriComponentsBuilder.fromUriString("../../").build().toString(), equalTo("../../")); - assertThat(UriComponentsBuilder.fromUriString("../../").build().toUriString(), equalTo("../../")); - assertThat(UriComponentsBuilder.fromUriString("../../").build().toUri().getPath(), equalTo("../../")); - assertThat(UriComponentsBuilder.fromUriString("http://example.com").path("foo/../bar").build().toString(), equalTo("http://example.com/foo/../bar")); - assertThat(UriComponentsBuilder.fromUriString("http://example.com").path("foo/../bar").build().toUriString(), equalTo("http://example.com/foo/../bar")); - assertThat(UriComponentsBuilder.fromUriString("http://example.com").path("foo/../bar").build().toUri().getPath(), equalTo("/foo/../bar")); + String baseUrl = "http://example.com"; + assertThat(UriComponentsBuilder.fromUriString(baseUrl + "/foo/../bar").build().toString(), + equalTo(baseUrl + "/foo/../bar")); + assertThat(UriComponentsBuilder.fromUriString(baseUrl + "/foo/../bar").build().toUriString(), + equalTo(baseUrl + "/foo/../bar")); + assertThat(UriComponentsBuilder.fromUriString(baseUrl + "/foo/../bar").build().toUri().getPath(), + equalTo("/foo/../bar")); + assertThat(UriComponentsBuilder.fromUriString("../../").build().toString(), + equalTo("../../")); + assertThat(UriComponentsBuilder.fromUriString("../../").build().toUriString(), + equalTo("../../")); + assertThat(UriComponentsBuilder.fromUriString("../../").build().toUri().getPath(), + equalTo("../../")); + assertThat(UriComponentsBuilder.fromUriString(baseUrl).path("foo/../bar").build().toString(), + equalTo(baseUrl + "/foo/../bar")); + assertThat(UriComponentsBuilder.fromUriString(baseUrl).path("foo/../bar").build().toUriString(), + equalTo(baseUrl + "/foo/../bar")); + assertThat(UriComponentsBuilder.fromUriString(baseUrl).path("foo/../bar").build().toUri().getPath(), + equalTo("/foo/../bar")); } @Test public void emptySegments() throws Exception { - assertThat(UriComponentsBuilder.fromUriString("http://example.com/abc/").path("/x/y/z").build().toString(), equalTo("http://example.com/abc/x/y/z")); - assertThat(UriComponentsBuilder.fromUriString("http://example.com/abc/").pathSegment("x", "y", "z").build().toString(), equalTo("http://example.com/abc/x/y/z")); - assertThat(UriComponentsBuilder.fromUriString("http://example.com/abc/").path("/x/").path("/y/z").build().toString(), equalTo("http://example.com/abc/x/y/z")); - assertThat(UriComponentsBuilder.fromUriString("http://example.com/abc/").pathSegment("x").path("y").build().toString(), equalTo("http://example.com/abc/x/y")); + String baseUrl = "http://example.com/abc/"; + assertThat(UriComponentsBuilder.fromUriString(baseUrl).path("/x/y/z").build().toString(), + equalTo("http://example.com/abc/x/y/z")); + assertThat(UriComponentsBuilder.fromUriString(baseUrl).pathSegment("x", "y", "z").build().toString(), + equalTo("http://example.com/abc/x/y/z")); + assertThat(UriComponentsBuilder.fromUriString(baseUrl).path("/x/").path("/y/z").build().toString(), + equalTo("http://example.com/abc/x/y/z")); + assertThat(UriComponentsBuilder.fromUriString(baseUrl).pathSegment("x").path("y").build().toString(), + equalTo("http://example.com/abc/x/y")); } @Test diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java index 7a43337cc5b..980dac38bbc 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java @@ -159,24 +159,26 @@ public class UriComponentsTests { @Test public void equalsHierarchicalUriComponents() throws Exception { - UriComponents uriComponents1 = UriComponentsBuilder.fromUriString("http://example.com").path("/{foo}").query("bar={baz}").build(); - UriComponents uriComponents2 = UriComponentsBuilder.fromUriString("http://example.com").path("/{foo}").query("bar={baz}").build(); - UriComponents uriComponents3 = UriComponentsBuilder.fromUriString("http://example.com").path("/{foo}").query("bin={baz}").build(); - assertThat(uriComponents1, instanceOf(HierarchicalUriComponents.class)); - assertThat(uriComponents1, equalTo(uriComponents1)); - assertThat(uriComponents1, equalTo(uriComponents2)); - assertThat(uriComponents1, not(equalTo(uriComponents3))); + String url = "http://example.com"; + UriComponents uric1 = UriComponentsBuilder.fromUriString(url).path("/{foo}").query("bar={baz}").build(); + UriComponents uric2 = UriComponentsBuilder.fromUriString(url).path("/{foo}").query("bar={baz}").build(); + UriComponents uric3 = UriComponentsBuilder.fromUriString(url).path("/{foo}").query("bin={baz}").build(); + assertThat(uric1, instanceOf(HierarchicalUriComponents.class)); + assertThat(uric1, equalTo(uric1)); + assertThat(uric1, equalTo(uric2)); + assertThat(uric1, not(equalTo(uric3))); } @Test public void equalsOpaqueUriComponents() throws Exception { - UriComponents uriComponents1 = UriComponentsBuilder.fromUriString("http:example.com/foo/bar").build(); - UriComponents uriComponents2 = UriComponentsBuilder.fromUriString("http:example.com/foo/bar").build(); - UriComponents uriComponents3 = UriComponentsBuilder.fromUriString("http:example.com/foo/bin").build(); - assertThat(uriComponents1, instanceOf(OpaqueUriComponents.class)); - assertThat(uriComponents1, equalTo(uriComponents1)); - assertThat(uriComponents1, equalTo(uriComponents2)); - assertThat(uriComponents1, not(equalTo(uriComponents3))); + String baseUrl = "http:example.com"; + UriComponents uric1 = UriComponentsBuilder.fromUriString(baseUrl + "/foo/bar").build(); + UriComponents uric2 = UriComponentsBuilder.fromUriString(baseUrl + "/foo/bar").build(); + UriComponents uric3 = UriComponentsBuilder.fromUriString(baseUrl + "/foo/bin").build(); + assertThat(uric1, instanceOf(OpaqueUriComponents.class)); + assertThat(uric1, equalTo(uric1)); + assertThat(uric1, equalTo(uric2)); + assertThat(uric1, not(equalTo(uric3))); } } diff --git a/spring-web/src/test/java/org/springframework/web/util/WebUtilsTests.java b/spring-web/src/test/java/org/springframework/web/util/WebUtilsTests.java index 201c7cda4f7..c86c3e8b904 100644 --- a/spring-web/src/test/java/org/springframework/web/util/WebUtilsTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/WebUtilsTests.java @@ -30,7 +30,10 @@ import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.util.MultiValueMap; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; /** * @author Juergen Hoeller @@ -126,10 +129,15 @@ public class WebUtilsTests { // Handling of IPv6 hosts as described in SPR-13525 assertTrue(checkSameOrigin("[::1]", -1, "http://[::1]")); assertTrue(checkSameOrigin("[::1]", 8080, "http://[::1]:8080")); - assertTrue(checkSameOrigin("[2001:0db8:0000:85a3:0000:0000:ac1f:8001]", -1, "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]")); - assertTrue(checkSameOrigin("[2001:0db8:0000:85a3:0000:0000:ac1f:8001]", 8080, "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]:8080")); + assertTrue(checkSameOrigin( + "[2001:0db8:0000:85a3:0000:0000:ac1f:8001]", -1, + "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]")); + assertTrue(checkSameOrigin( + "[2001:0db8:0000:85a3:0000:0000:ac1f:8001]", 8080, + "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]:8080")); assertFalse(checkSameOrigin("[::1]", -1, "http://[::1]:8080")); - assertFalse(checkSameOrigin("[::1]", 8080, "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]:8080")); + assertFalse(checkSameOrigin("[::1]", 8080, + "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]:8080")); } diff --git a/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternParserTests.java b/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternParserTests.java index 30345049e4d..9f611963b1e 100644 --- a/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternParserTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternParserTests.java @@ -33,7 +33,6 @@ import static org.junit.Assert.fail; /** * Exercise the {@link PathPatternParser}. - * * @author Andy Clement */ public class PathPatternParserTests { @@ -62,7 +61,8 @@ public class PathPatternParserTests { public void multiwildcardPattern() { pathPattern = checkStructure("/**"); assertPathElements(pathPattern, WildcardTheRestPathElement.class); - pathPattern = checkStructure("/**acb"); // this is not double wildcard use, it is / then **acb (an odd, unnecessary use of double *) + // this is not double wildcard, it's / then **acb (an odd, unnecessary use of double *) + pathPattern = checkStructure("/**acb"); assertPathElements(pathPattern, SeparatorPathElement.class, RegexPathElement.class); } @@ -122,33 +122,40 @@ public class PathPatternParserTests { checkError("/{var:a{{1,2}}}", 6, PatternMessage.REGEX_PATTERN_SYNTAX_EXCEPTION); pathPattern = checkStructure("/{var:\\\\}"); - assertEquals(CaptureVariablePathElement.class.getName(), pathPattern.getHeadSection().next.getClass().getName()); + PathElement next = pathPattern.getHeadSection().next; + assertEquals(CaptureVariablePathElement.class.getName(), next.getClass().getName()); assertMatches(pathPattern,"/\\"); pathPattern = checkStructure("/{var:\\/}"); - assertEquals(CaptureVariablePathElement.class.getName(), pathPattern.getHeadSection().next.getClass().getName()); + next = pathPattern.getHeadSection().next; + assertEquals(CaptureVariablePathElement.class.getName(), next.getClass().getName()); assertNoMatch(pathPattern,"/aaa"); pathPattern = checkStructure("/{var:a{1,2}}"); - assertEquals(CaptureVariablePathElement.class.getName(), pathPattern.getHeadSection().next.getClass().getName()); + next = pathPattern.getHeadSection().next; + assertEquals(CaptureVariablePathElement.class.getName(), next.getClass().getName()); pathPattern = checkStructure("/{var:[^\\/]*}"); - assertEquals(CaptureVariablePathElement.class.getName(), pathPattern.getHeadSection().next.getClass().getName()); + next = pathPattern.getHeadSection().next; + assertEquals(CaptureVariablePathElement.class.getName(), next.getClass().getName()); PathPattern.PathMatchInfo result = matchAndExtract(pathPattern,"/foo"); assertEquals("foo", result.getUriVariables().get("var")); pathPattern = checkStructure("/{var:\\[*}"); - assertEquals(CaptureVariablePathElement.class.getName(), pathPattern.getHeadSection().next.getClass().getName()); + next = pathPattern.getHeadSection().next; + assertEquals(CaptureVariablePathElement.class.getName(), next.getClass().getName()); result = matchAndExtract(pathPattern,"/[[["); assertEquals("[[[", result.getUriVariables().get("var")); pathPattern = checkStructure("/{var:[\\{]*}"); - assertEquals(CaptureVariablePathElement.class.getName(), pathPattern.getHeadSection().next.getClass().getName()); + next = pathPattern.getHeadSection().next; + assertEquals(CaptureVariablePathElement.class.getName(), next.getClass().getName()); result = matchAndExtract(pathPattern,"/{{{"); assertEquals("{{{", result.getUriVariables().get("var")); pathPattern = checkStructure("/{var:[\\}]*}"); - assertEquals(CaptureVariablePathElement.class.getName(), pathPattern.getHeadSection().next.getClass().getName()); + next = pathPattern.getHeadSection().next; + assertEquals(CaptureVariablePathElement.class.getName(), next.getClass().getName()); result = matchAndExtract(pathPattern,"/}}}"); assertEquals("}}}", result.getUriVariables().get("var")); @@ -159,7 +166,8 @@ public class PathPatternParserTests { checkStructure("*/"); checkStructure("/*/"); pathPattern = checkStructure("/*a*/"); - assertEquals(RegexPathElement.class.getName(), pathPattern.getHeadSection().next.getClass().getName()); + next = pathPattern.getHeadSection().next; + assertEquals(RegexPathElement.class.getName(), next.getClass().getName()); pathPattern = checkStructure("*/"); assertEquals(WildcardPathElement.class.getName(), pathPattern.getHeadSection().getClass().getName()); checkError("{foo}_{foo}", 0, PatternMessage.ILLEGAL_DOUBLE_CAPTURE, "foo"); @@ -308,12 +316,12 @@ public class PathPatternParserTests { public void multipleSeparatorPatterns() { pathPattern = checkStructure("///aaa"); assertEquals(6, pathPattern.getNormalizedLength()); - assertPathElements(pathPattern, SeparatorPathElement.class, SeparatorPathElement.class, SeparatorPathElement.class, - LiteralPathElement.class); + assertPathElements(pathPattern, SeparatorPathElement.class, SeparatorPathElement.class, + SeparatorPathElement.class, LiteralPathElement.class); pathPattern = checkStructure("///aaa////aaa/b"); assertEquals(15, pathPattern.getNormalizedLength()); - assertPathElements(pathPattern, SeparatorPathElement.class, SeparatorPathElement.class, SeparatorPathElement.class, - LiteralPathElement.class, SeparatorPathElement.class, + assertPathElements(pathPattern, SeparatorPathElement.class, SeparatorPathElement.class, + SeparatorPathElement.class, LiteralPathElement.class, SeparatorPathElement.class, SeparatorPathElement.class, SeparatorPathElement.class, SeparatorPathElement.class, LiteralPathElement.class, SeparatorPathElement.class, LiteralPathElement.class); pathPattern = checkStructure("/////**"); @@ -421,7 +429,9 @@ public class PathPatternParserTests { return pp; } - private void checkError(String pattern, int expectedPos, PatternMessage expectedMessage, String... expectedInserts) { + private void checkError(String pattern, int expectedPos, PatternMessage expectedMessage, + String... expectedInserts) { + try { pathPattern = parse(pattern); fail("Expected to fail"); diff --git a/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternTests.java b/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternTests.java index 32f8db3458a..e9d7d3cd49d 100644 --- a/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternTests.java @@ -329,13 +329,16 @@ public class PathPatternTests { // With a /** on the end have to check if there is any more data post // 'the match' it starts with a separator assertNull(parse("/resource/**").matchStartOfPath(toPathContainer("/resourceX"))); - assertEquals("",parse("/resource/**").matchStartOfPath(toPathContainer("/resource")).getPathRemaining().value()); + assertEquals("",parse("/resource/**") + .matchStartOfPath(toPathContainer("/resource")).getPathRemaining().value()); // Similar to above for the capture-the-rest variant assertNull(parse("/resource/{*foo}").matchStartOfPath(toPathContainer("/resourceX"))); - assertEquals("",parse("/resource/{*foo}").matchStartOfPath(toPathContainer("/resource")).getPathRemaining().value()); + assertEquals("", parse("/resource/{*foo}") + .matchStartOfPath(toPathContainer("/resource")).getPathRemaining().value()); - PathPattern.PathRemainingMatchInfo pri = parse("/aaa/{bbb}/c?d/e*f/*/g").matchStartOfPath(toPathContainer("/aaa/b/ccd/ef/x/g/i")); + PathPattern.PathRemainingMatchInfo pri = parse("/aaa/{bbb}/c?d/e*f/*/g") + .matchStartOfPath(toPathContainer("/aaa/b/ccd/ef/x/g/i")); assertNotNull(pri); assertEquals("/i",pri.getPathRemaining().value()); assertEquals("b",pri.getUriVariables().get("bbb")); @@ -397,7 +400,8 @@ public class PathPatternTests { @Test public void multipleSeparatorsInPattern() { PathPattern pp = parse("a//b//c"); - assertEquals("Literal(a) Separator(/) Separator(/) Literal(b) Separator(/) Separator(/) Literal(c)",pp.toChainString()); + assertEquals("Literal(a) Separator(/) Separator(/) Literal(b) Separator(/) Separator(/) Literal(c)", + pp.toChainString()); assertMatches(pp,"a//b//c"); assertEquals("Literal(a) Separator(/) WildcardTheRest(/**)",parse("a//**").toChainString()); checkMatches("///abc", "///abc"); @@ -812,7 +816,8 @@ public class PathPatternTests { assertEquals("com.example", result.getUriVariables().get("symbolicName")); assertEquals("1.0.0", result.getUriVariables().get("version")); - p = pp.parse("{symbolicName:[\\w\\.]+}-sources-{version:[\\d\\.]+}-{year:\\d{4}}{month:\\d{2}}{day:\\d{2}}.jar"); + p = pp.parse("{symbolicName:[\\w\\.]+}-sources-" + + "{version:[\\d\\.]+}-{year:\\d{4}}{month:\\d{2}}{day:\\d{2}}.jar"); result = matchAndExtract(p,"com.example-sources-1.0.0-20100220.jar"); assertEquals("com.example", result.getUriVariables().get("symbolicName")); assertEquals("1.0.0", result.getUriVariables().get("version")); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java index 2f86ea9c8ed..1d9dafde53f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java @@ -84,7 +84,9 @@ public abstract class BodyExtractors { * @param the element type * @return a {@code BodyExtractor} that reads a mono */ - public static BodyExtractor, ReactiveHttpInputMessage> toMono(ParameterizedTypeReference typeReference) { + public static BodyExtractor, ReactiveHttpInputMessage> toMono( + ParameterizedTypeReference typeReference) { + Assert.notNull(typeReference, "'typeReference' must not be null"); return toMono(ResolvableType.forType(typeReference.getType())); } @@ -134,7 +136,9 @@ public abstract class BodyExtractors { * @param the element type * @return a {@code BodyExtractor} that reads a flux */ - public static BodyExtractor, ReactiveHttpInputMessage> toFlux(ParameterizedTypeReference typeReference) { + public static BodyExtractor, ReactiveHttpInputMessage> toFlux( + ParameterizedTypeReference typeReference) { + Assert.notNull(typeReference, "'typeReference' must not be null"); return toFlux(ResolvableType.forType(typeReference.getType())); } @@ -174,12 +178,13 @@ public abstract class BodyExtractors { // ReactiveHttpInputMessage like other methods, since reading form data only typically happens on // the server-side public static BodyExtractor>, ServerHttpRequest> toFormData() { - return (serverRequest, context) -> { - HttpMessageReader> messageReader = - messageReader(FORM_MAP_TYPE, MediaType.APPLICATION_FORM_URLENCODED, context); + return (request, context) -> { + ResolvableType type = FORM_MAP_TYPE; + HttpMessageReader> reader = + messageReader(type, MediaType.APPLICATION_FORM_URLENCODED, context); return context.serverResponse() - .map(serverResponse -> messageReader.readMono(FORM_MAP_TYPE, FORM_MAP_TYPE, serverRequest, serverResponse, context.hints())) - .orElseGet(() -> messageReader.readMono(FORM_MAP_TYPE, serverRequest, context.hints())); + .map(response -> reader.readMono(type, type, request, response, context.hints())) + .orElseGet(() -> reader.readMono(type, request, context.hints())); }; } @@ -193,12 +198,12 @@ public abstract class BodyExtractors { // the server-side public static BodyExtractor>, ServerHttpRequest> toMultipartData() { return (serverRequest, context) -> { - HttpMessageReader> messageReader = - messageReader(MULTIPART_MAP_TYPE, MediaType.MULTIPART_FORM_DATA, context); + ResolvableType type = MULTIPART_MAP_TYPE; + HttpMessageReader> reader = + messageReader(type, MediaType.MULTIPART_FORM_DATA, context); return context.serverResponse() - .map(serverResponse -> messageReader.readMono(MULTIPART_MAP_TYPE, - MULTIPART_MAP_TYPE, serverRequest, serverResponse, context.hints())) - .orElseGet(() -> messageReader.readMono(MULTIPART_MAP_TYPE, serverRequest, context.hints())); + .map(response -> reader.readMono(type, type, serverRequest, response, context.hints())) + .orElseGet(() -> reader.readMono(type, serverRequest, context.hints())); }; } @@ -212,11 +217,11 @@ public abstract class BodyExtractors { // the server-side public static BodyExtractor, ServerHttpRequest> toParts() { return (serverRequest, context) -> { - HttpMessageReader messageReader = - messageReader(PART_TYPE, MediaType.MULTIPART_FORM_DATA, context); + ResolvableType type = PART_TYPE; + HttpMessageReader reader = messageReader(type, MediaType.MULTIPART_FORM_DATA, context); return context.serverResponse() - .map(serverResponse -> messageReader.read(PART_TYPE, PART_TYPE, serverRequest, serverResponse, context.hints())) - .orElseGet(() -> messageReader.read(PART_TYPE, serverRequest, context.hints())); + .map(response -> reader.read(type, type, serverRequest, response, context.hints())) + .orElseGet(() -> reader.read(type, serverRequest, context.hints())); }; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index dfae1a19dbe..89bf43c9a6d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -298,7 +298,9 @@ class DefaultWebClient implements WebClient { } @Override - public > RequestHeadersSpec body(P publisher, ParameterizedTypeReference typeReference) { + public > RequestHeadersSpec body(P publisher, + ParameterizedTypeReference typeReference) { + this.inserter = BodyInserters.fromPublisher(publisher, typeReference); return this; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ExchangeFilterFunctions.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ExchangeFilterFunctions.java index 5820b8b3839..933599348ce 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ExchangeFilterFunctions.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ExchangeFilterFunctions.java @@ -42,10 +42,11 @@ import org.springframework.util.Assert; public abstract class ExchangeFilterFunctions { /** - * Name of the {@link ClientRequest} attribute that contains the {@link Credentials}, as used by - * {@link #basicAuthentication()} + * Name of the {@link ClientRequest} attribute that contains the + * {@link Credentials}, as used by {@link #basicAuthentication()}. */ - public static final String BASIC_AUTHENTICATION_CREDENTIALS_ATTRIBUTE = ExchangeFilterFunctions.class.getName() + ".basicAuthenticationCredentials"; + public static final String BASIC_AUTHENTICATION_CREDENTIALS_ATTRIBUTE = + ExchangeFilterFunctions.class.getName() + ".basicAuthenticationCredentials"; /** diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/EntityResponse.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/EntityResponse.java index 8c23eb4b7b0..a01b8dd857d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/EntityResponse.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/EntityResponse.java @@ -86,7 +86,9 @@ public interface EntityResponse extends ServerResponse { * @param

    the type of the {@code Publisher} * @return the created builder */ - static > Builder

    fromPublisher(P publisher, ParameterizedTypeReference typeReference) { + static > Builder

    fromPublisher(P publisher, + ParameterizedTypeReference typeReference) { + return new DefaultEntityResponseBuilder<>(publisher, BodyInserters.fromPublisher(publisher, typeReference)); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java index 7174b7d2a61..c3976b4774a 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java @@ -71,8 +71,9 @@ public final class RequestMappingInfo implements RequestCondition custom) { this.name = (StringUtils.hasText(name) ? name : null); @@ -88,8 +89,9 @@ public final class RequestMappingInfo implements RequestCondition custom) { this(null, patterns, methods, params, headers, consumes, produces, custom); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueArgumentResolver.java index d50a3b6208a..4a02e8aa76e 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueArgumentResolver.java @@ -75,7 +75,9 @@ public abstract class AbstractNamedValueArgumentResolver extends HandlerMethodAr * values are not expected to contain expressions * @param registry for checking reactive type wrappers */ - public AbstractNamedValueArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public AbstractNamedValueArgumentResolver(@Nullable ConfigurableBeanFactory factory, + ReactiveAdapterRegistry registry) { + super(registry); this.configurableBeanFactory = factory; this.expressionContext = (factory != null ? new BeanExpressionContext(factory, null) : null); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java index 9f12047070f..f01c89de67f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java @@ -44,7 +44,9 @@ public class CookieValueMethodArgumentResolver extends AbstractNamedValueSyncArg * or {@code null} if default values are not expected to contain expressions * @param registry for checking reactive type wrappers */ - public CookieValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public CookieValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, + ReactiveAdapterRegistry registry) { + super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java index de814544c6a..87b340e16f6 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java @@ -42,7 +42,9 @@ public class ExpressionValueMethodArgumentResolver extends AbstractNamedValueSyn * or {@code null} if default values are not expected to contain expressions * @param registry for checking reactive type wrappers */ - public ExpressionValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public ExpressionValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, + ReactiveAdapterRegistry registry) { + super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java index 08e08b2a7f4..0a7274fd07d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java @@ -60,7 +60,9 @@ public class PathVariableMethodArgumentResolver extends AbstractNamedValueSyncAr * or {@code null} if default values are not expected to contain expressions * @param registry for checking reactive type wrappers */ - public PathVariableMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public PathVariableMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, + ReactiveAdapterRegistry registry) { + super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestAttributeMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestAttributeMethodArgumentResolver.java index c474afe49ee..18faa1247cf 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestAttributeMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestAttributeMethodArgumentResolver.java @@ -42,7 +42,9 @@ public class RequestAttributeMethodArgumentResolver extends AbstractNamedValueSy * or {@code null} if default values are not expected to have expressions * @param registry for checking reactive type wrappers */ - public RequestAttributeMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public RequestAttributeMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, + ReactiveAdapterRegistry registry) { + super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java index 3e04eb60801..c21e349dfb0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java @@ -53,7 +53,9 @@ public class RequestHeaderMethodArgumentResolver extends AbstractNamedValueSyncA * or {@code null} if default values are not expected to have expressions * @param registry for checking reactive type wrappers */ - public RequestHeaderMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public RequestHeaderMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, + ReactiveAdapterRegistry registry) { + super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java index 771041fbed9..1a7cbe62f24 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java @@ -113,7 +113,9 @@ public class HttpMessageWriterView implements View { @Override @SuppressWarnings("unchecked") - public Mono render(@Nullable Map model, @Nullable MediaType contentType, ServerWebExchange exchange) { + public Mono render(@Nullable Map model, @Nullable MediaType contentType, + ServerWebExchange exchange) { + Object value = getObjectToRender(model); return (value != null) ? write(value, contentType, exchange) : diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java index 408a6da1da3..37d5099e808 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java @@ -84,11 +84,9 @@ public class DelegatingWebFluxConfigurationTests { @Test public void requestMappingHandlerAdapter() throws Exception { delegatingConfig.setConfigurers(Collections.singletonList(webFluxConfigurer)); - RequestMappingHandlerAdapter adapter = delegatingConfig.requestMappingHandlerAdapter(); - ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); - ConversionService initializerConversionService = initializer.getConversionService(); - assertTrue(initializer.getValidator() instanceof LocalValidatorFactoryBean); + ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) + this.delegatingConfig.requestMappingHandlerAdapter().getWebBindingInitializer(); verify(webFluxConfigurer).configureHttpMessageCodecs(codecsConfigurer.capture()); verify(webFluxConfigurer).getValidator(); @@ -96,7 +94,9 @@ public class DelegatingWebFluxConfigurationTests { verify(webFluxConfigurer).addFormatters(formatterRegistry.capture()); verify(webFluxConfigurer).configureArgumentResolvers(any()); - assertSame(formatterRegistry.getValue(), initializerConversionService); + assertNotNull(initializer); + assertTrue(initializer.getValidator() instanceof LocalValidatorFactoryBean); + assertSame(formatterRegistry.getValue(), initializer.getConversionService()); assertEquals(12, codecsConfigurer.getValue().getReaders().size()); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java index 2fcddeafa3c..37340a720dc 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java @@ -87,8 +87,8 @@ public class WebFluxConfigurationSupportTests { @Test public void requestMappingHandlerMapping() throws Exception { ApplicationContext context = loadConfig(WebFluxConfig.class); - final Field trailingSlashField = ReflectionUtils.findField(PathPatternParser.class, "matchOptionalTrailingSeparator"); - ReflectionUtils.makeAccessible(trailingSlashField); + final Field field = ReflectionUtils.findField(PathPatternParser.class, "matchOptionalTrailingSeparator"); + ReflectionUtils.makeAccessible(field); String name = "requestMappingHandlerMapping"; RequestMappingHandlerMapping mapping = context.getBean(name, RequestMappingHandlerMapping.class); @@ -96,9 +96,9 @@ public class WebFluxConfigurationSupportTests { assertEquals(0, mapping.getOrder()); - assertNotNull(mapping.getPathPatternParser()); - boolean matchOptionalTrailingSlash = (boolean) ReflectionUtils - .getField(trailingSlashField, mapping.getPathPatternParser()); + PathPatternParser patternParser = mapping.getPathPatternParser(); + assertNotNull(patternParser); + boolean matchOptionalTrailingSlash = (boolean) ReflectionUtils.getField(field, patternParser); assertTrue(matchOptionalTrailingSlash); name = "webFluxContentTypeResolver"; @@ -112,16 +112,16 @@ public class WebFluxConfigurationSupportTests { @Test public void customPathMatchConfig() throws Exception { ApplicationContext context = loadConfig(CustomPatchMatchConfig.class); - final Field trailingSlashField = ReflectionUtils.findField(PathPatternParser.class, "matchOptionalTrailingSeparator"); - ReflectionUtils.makeAccessible(trailingSlashField); + final Field field = ReflectionUtils.findField(PathPatternParser.class, "matchOptionalTrailingSeparator"); + ReflectionUtils.makeAccessible(field); String name = "requestMappingHandlerMapping"; RequestMappingHandlerMapping mapping = context.getBean(name, RequestMappingHandlerMapping.class); assertNotNull(mapping); - assertNotNull(mapping.getPathPatternParser()); - boolean matchOptionalTrailingSlash = (boolean) ReflectionUtils - .getField(trailingSlashField, mapping.getPathPatternParser()); + PathPatternParser patternParser = mapping.getPathPatternParser(); + assertNotNull(patternParser); + boolean matchOptionalTrailingSlash = (boolean) ReflectionUtils.getField(field, patternParser); assertFalse(matchOptionalTrailingSlash); } @@ -136,11 +136,13 @@ public class WebFluxConfigurationSupportTests { List> readers = adapter.getMessageReaders(); assertEquals(12, readers.size()); + ResolvableType multiValueMapType = forClassWithGenerics(MultiValueMap.class, String.class, String.class); + assertHasMessageReader(readers, forClass(byte[].class), APPLICATION_OCTET_STREAM); assertHasMessageReader(readers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM); assertHasMessageReader(readers, forClass(String.class), TEXT_PLAIN); assertHasMessageReader(readers, forClass(Resource.class), IMAGE_PNG); - assertHasMessageReader(readers, forClassWithGenerics(MultiValueMap.class, String.class, String.class), APPLICATION_FORM_URLENCODED); + assertHasMessageReader(readers, multiValueMapType, APPLICATION_FORM_URLENCODED); assertHasMessageReader(readers, forClass(TestBean.class), APPLICATION_XML); assertHasMessageReader(readers, forClass(TestBean.class), APPLICATION_JSON); assertHasMessageReader(readers, forClass(TestBean.class), new MediaType("application", "x-jackson-smile")); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java index e1627f3dcaa..fb1c45a8a04 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java @@ -126,8 +126,8 @@ public class BodyExtractorsTests { @Test public void toMonoParameterizedTypeReference() throws Exception { - ParameterizedTypeReference> typeReference = new ParameterizedTypeReference>() {}; - BodyExtractor>, ReactiveHttpInputMessage> extractor = BodyExtractors.toMono(typeReference); + BodyExtractor>, ReactiveHttpInputMessage> extractor = + BodyExtractors.toMono(new ParameterizedTypeReference>() {}); DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); DefaultDataBuffer dataBuffer = @@ -206,8 +206,8 @@ public class BodyExtractorsTests { this.hints.put(JSON_VIEW_HINT, SafeToDeserialize.class); DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); - DefaultDataBuffer dataBuffer = - factory.wrap(ByteBuffer.wrap("[{\"username\":\"foo\",\"password\":\"bar\"},{\"username\":\"bar\",\"password\":\"baz\"}]".getBytes(StandardCharsets.UTF_8))); + String text = "[{\"username\":\"foo\",\"password\":\"bar\"},{\"username\":\"bar\",\"password\":\"baz\"}]"; + DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap(text.getBytes(StandardCharsets.UTF_8))); Flux body = Flux.just(dataBuffer); MockServerHttpRequest request = MockServerHttpRequest.post("/") @@ -270,8 +270,8 @@ public class BodyExtractorsTests { BodyExtractor>, ServerHttpRequest> extractor = BodyExtractors.toFormData(); DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); - DefaultDataBuffer dataBuffer = - factory.wrap(ByteBuffer.wrap("name+1=value+1&name+2=value+2%2B1&name+2=value+2%2B2&name+3".getBytes(StandardCharsets.UTF_8))); + String text = "name+1=value+1&name+2=value+2%2B1&name+2=value+2%2B2&name+3"; + DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap(text.getBytes(StandardCharsets.UTF_8))); Flux body = Flux.just(dataBuffer); MockServerHttpRequest request = MockServerHttpRequest.post("/") diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PathResourceLookupFunctionTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PathResourceLookupFunctionTests.java index 1a19be2561f..b734ffaa37a 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PathResourceLookupFunctionTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/PathResourceLookupFunctionTests.java @@ -66,7 +66,8 @@ public class PathResourceLookupFunctionTests { .uri(new URI("http://localhost/resources/child/response.txt")) .build(); Mono result = function.apply(request); - File expected = new ClassPathResource("org/springframework/web/reactive/function/server/child/response.txt").getFile(); + String path = "org/springframework/web/reactive/function/server/child/response.txt"; + File expected = new ClassPathResource(path).getFile(); StepVerifier.create(result) .expectNextMatches(resource -> { try { diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java index 19daefd91ee..c37ef8a459e 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/condition/ProducesRequestConditionTests.java @@ -41,7 +41,7 @@ public class ProducesRequestConditionTests { @Test public void match() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "text/plain")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "text/plain")); ProducesRequestCondition condition = new ProducesRequestCondition("text/plain"); assertNotNull(condition.getMatchingCondition(exchange)); @@ -49,7 +49,7 @@ public class ProducesRequestConditionTests { @Test public void matchNegated() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "text/plain")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "text/plain")); ProducesRequestCondition condition = new ProducesRequestCondition("!text/plain"); assertNull(condition.getMatchingCondition(exchange)); @@ -63,7 +63,7 @@ public class ProducesRequestConditionTests { @Test public void matchWildcard() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "text/plain")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "text/plain")); ProducesRequestCondition condition = new ProducesRequestCondition("text/*"); assertNotNull(condition.getMatchingCondition(exchange)); @@ -71,7 +71,7 @@ public class ProducesRequestConditionTests { @Test public void matchMultiple() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "text/plain")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "text/plain")); ProducesRequestCondition condition = new ProducesRequestCondition("text/plain", "application/xml"); assertNotNull(condition.getMatchingCondition(exchange)); @@ -79,7 +79,7 @@ public class ProducesRequestConditionTests { @Test public void matchSingle() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "application/xml")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "application/xml")); ProducesRequestCondition condition = new ProducesRequestCondition("text/plain"); assertNull(condition.getMatchingCondition(exchange)); @@ -87,7 +87,7 @@ public class ProducesRequestConditionTests { @Test public void matchParseError() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "bogus")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "bogus")); ProducesRequestCondition condition = new ProducesRequestCondition("text/plain"); assertNull(condition.getMatchingCondition(exchange)); @@ -95,7 +95,7 @@ public class ProducesRequestConditionTests { @Test public void matchParseErrorWithNegation() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "bogus")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "bogus")); ProducesRequestCondition condition = new ProducesRequestCondition("!text/plain"); assertNull(condition.getMatchingCondition(exchange)); @@ -107,7 +107,7 @@ public class ProducesRequestConditionTests { ProducesRequestCondition xml = new ProducesRequestCondition("application/xml"); ProducesRequestCondition none = new ProducesRequestCondition(); - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "application/xml, text/html")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "application/xml, text/html")); assertTrue(html.compareTo(xml, exchange) > 0); assertTrue(xml.compareTo(html, exchange) < 0); @@ -117,20 +117,20 @@ public class ProducesRequestConditionTests { assertTrue(none.compareTo(html, exchange) > 0); exchange = MockServerWebExchange.from( - MockServerHttpRequest.get("/").header("Accept", "application/xml, text/*")); + get("/").header("Accept", "application/xml, text/*")); assertTrue(html.compareTo(xml, exchange) > 0); assertTrue(xml.compareTo(html, exchange) < 0); exchange = MockServerWebExchange.from( - MockServerHttpRequest.get("/").header("Accept", "application/pdf")); + get("/").header("Accept", "application/pdf")); assertTrue(html.compareTo(xml, exchange) == 0); assertTrue(xml.compareTo(html, exchange) == 0); // See SPR-7000 exchange = MockServerWebExchange.from( - MockServerHttpRequest.get("/").header("Accept", "text/html;q=0.9,application/xml")); + get("/").header("Accept", "text/html;q=0.9,application/xml")); assertTrue(html.compareTo(xml, exchange) > 0); assertTrue(xml.compareTo(html, exchange) < 0); @@ -138,7 +138,7 @@ public class ProducesRequestConditionTests { @Test public void compareToWithSingleExpression() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "text/plain")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "text/plain")); ProducesRequestCondition condition1 = new ProducesRequestCondition("text/plain"); ProducesRequestCondition condition2 = new ProducesRequestCondition("text/*"); @@ -155,7 +155,7 @@ public class ProducesRequestConditionTests { ProducesRequestCondition condition1 = new ProducesRequestCondition("*/*", "text/plain"); ProducesRequestCondition condition2 = new ProducesRequestCondition("text/*", "text/plain;q=0.7"); - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "text/plain")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "text/plain")); int result = condition1.compareTo(condition2, exchange); assertTrue("Invalid comparison result: " + result, result < 0); @@ -179,7 +179,7 @@ public class ProducesRequestConditionTests { assertTrue("Invalid comparison result: " + result, result > 0); exchange = MockServerWebExchange.from( - MockServerHttpRequest.get("/").header("Accept", "application/xml", "text/plain")); + get("/").header("Accept", "application/xml", "text/plain")); result = condition1.compareTo(condition2, exchange); assertTrue("Invalid comparison result: " + result, result > 0); @@ -192,7 +192,7 @@ public class ProducesRequestConditionTests { @Test public void compareToMediaTypeAll() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/")); ProducesRequestCondition condition1 = new ProducesRequestCondition(); ProducesRequestCondition condition2 = new ProducesRequestCondition("application/json"); @@ -209,7 +209,7 @@ public class ProducesRequestConditionTests { assertTrue(condition2.compareTo(condition1, exchange) > 0); exchange = MockServerWebExchange.from( - MockServerHttpRequest.get("/").header("Accept", "*/*")); + get("/").header("Accept", "*/*")); condition1 = new ProducesRequestCondition(); condition2 = new ProducesRequestCondition("application/json"); @@ -228,7 +228,7 @@ public class ProducesRequestConditionTests { @Test public void compareToMediaTypeAllWithParameter() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "*/*;q=0.9")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "*/*;q=0.9")); ProducesRequestCondition condition1 = new ProducesRequestCondition(); ProducesRequestCondition condition2 = new ProducesRequestCondition("application/json"); @@ -239,7 +239,7 @@ public class ProducesRequestConditionTests { @Test public void compareToEqualMatch() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "text/*")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "text/*")); ProducesRequestCondition condition1 = new ProducesRequestCondition("text/plain"); ProducesRequestCondition condition2 = new ProducesRequestCondition("text/xhtml"); @@ -280,7 +280,7 @@ public class ProducesRequestConditionTests { @Test public void getMatchingCondition() throws Exception { - MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").header("Accept", "text/plain")); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/").header("Accept", "text/plain")); ProducesRequestCondition condition = new ProducesRequestCondition("text/plain", "application/xml"); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMappingTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMappingTests.java index b1bab45f352..547aff6da46 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMappingTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMappingTests.java @@ -18,9 +18,11 @@ package org.springframework.web.reactive.result.method; import java.lang.reflect.Method; import java.net.URI; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Consumer; @@ -190,9 +192,12 @@ public class RequestMappingInfoHandlerMappingTests { @Test public void getHandlerHttpOptions() throws Exception { + List allMethodExceptTrace = new ArrayList<>(Arrays.asList(HttpMethod.values())); + allMethodExceptTrace.remove(HttpMethod.TRACE); + testHttpOptions("/foo", EnumSet.of(HttpMethod.GET, HttpMethod.HEAD)); testHttpOptions("/person/1", EnumSet.of(HttpMethod.PUT)); - testHttpOptions("/persons", EnumSet.of(HttpMethod.GET, HttpMethod.HEAD, HttpMethod.POST, HttpMethod.PUT, HttpMethod.PATCH, HttpMethod.DELETE, HttpMethod.OPTIONS)); + testHttpOptions("/persons", EnumSet.copyOf(allMethodExceptTrace)); testHttpOptions("/something", EnumSet.of(HttpMethod.PUT, HttpMethod.POST)); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/JacksonHintsIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/JacksonHintsIntegrationTests.java index deef92b6ed5..85a45e8440c 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/JacksonHintsIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/JacksonHintsIntegrationTests.java @@ -85,9 +85,12 @@ public class JacksonHintsIntegrationTests extends AbstractRequestMappingIntegrat @Test public void jsonViewWithFluxRequest() throws Exception { - String expected = "[{\"withView1\":\"with\",\"withView2\":null,\"withoutView\":null}," + + String expected = "[" + + "{\"withView1\":\"with\",\"withView2\":null,\"withoutView\":null}," + "{\"withView1\":\"with\",\"withView2\":null,\"withoutView\":null}]"; - List beans = Arrays.asList(new JacksonViewBean("with", "with", "without"), new JacksonViewBean("with", "with", "without")); + List beans = Arrays.asList( + new JacksonViewBean("with", "with", "without"), + new JacksonViewBean("with", "with", "without")); assertEquals(expected, performPost("/request/flux", MediaType.APPLICATION_JSON, beans, MediaType.APPLICATION_JSON_UTF8, String.class).getBody()); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/MessageReaderArgumentResolverTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/MessageReaderArgumentResolverTests.java index 019450e4a10..ce9246549d4 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/MessageReaderArgumentResolverTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/MessageReaderArgumentResolverTests.java @@ -321,7 +321,7 @@ public class MessageReaderArgumentResolverTests { return false; } @Override - public Mono resolveArgument(MethodParameter parameter, BindingContext bindingContext, ServerWebExchange exchange) { + public Mono resolveArgument(MethodParameter p, BindingContext bc, ServerWebExchange e) { return null; } }; diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingExceptionHandlingIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingExceptionHandlingIntegrationTests.java index 94c78002ba3..f9ea2c4f21a 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingExceptionHandlingIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingExceptionHandlingIntegrationTests.java @@ -67,7 +67,8 @@ public class RequestMappingExceptionHandlingIntegrationTests extends AbstractReq @Test public void controllerThrowingExceptionWithCauseToHandle() throws Exception { String expected = "Recovered from error: IO"; - assertEquals(expected, performGet("/thrown-exception-with-cause-to-handle", new HttpHeaders(), String.class).getBody()); + String url = "/thrown-exception-with-cause-to-handle"; + assertEquals(expected, performGet(url, new HttpHeaders(), String.class).getBody()); } @Test diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java index ef9212cf145..3bc66b13e40 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java @@ -360,7 +360,8 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq @Test public void personCreateWithRxJava2ObservableXml() throws Exception { People people = new People(new Person("Robert"), new Person("Marie")); - ResponseEntity response = performPost("/person-create/rxjava2-observable", APPLICATION_XML, people, null, Void.class); + String url = "/person-create/rxjava2-observable"; + ResponseEntity response = performPost(url, APPLICATION_XML, people, null, Void.class); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(2, getApplicationContext().getBean(PersonCreateController.class).persons.size()); @@ -600,7 +601,9 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq } @PostMapping("/rxjava2-observable") - public io.reactivex.Completable createWithRxJava2Observable(@RequestBody io.reactivex.Observable observable) { + public io.reactivex.Completable createWithRxJava2Observable( + @RequestBody io.reactivex.Observable observable) { + return observable.toList().doOnSuccess(persons::addAll).toCompletable(); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java index 8edecae0a17..2cd16362555 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java @@ -235,7 +235,8 @@ public class ResponseEntityResultHandlerTests { public void handleReturnValueLastModified() throws Exception { Instant currentTime = Instant.now().truncatedTo(ChronoUnit.SECONDS); Instant oneMinAgo = currentTime.minusSeconds(60); - MockServerWebExchange exchange = MockServerWebExchange.from(get("/path").ifModifiedSince(currentTime.toEpochMilli())); + long timestamp = currentTime.toEpochMilli(); + MockServerWebExchange exchange = MockServerWebExchange.from(get("/path").ifModifiedSince(timestamp)); ResponseEntity entity = ok().lastModified(oneMinAgo.toEpochMilli()).body("body"); MethodParameter returnType = on(TestController.class).resolveReturnType(entity(String.class)); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/AbstractViewTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/AbstractViewTests.java index c1f0143cc7e..e484679c386 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/AbstractViewTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/AbstractViewTests.java @@ -68,11 +68,12 @@ public class AbstractViewTests { TestView view = new TestView(); StepVerifier.create(view.render(attributes, null, this.exchange)).verifyComplete(); - assertEquals(testBean1, view.attributes.get("attr1")); - assertArrayEquals(new TestBean[] {testBean1, testBean2}, ((List)view.attributes.get("attr2")).toArray()); - assertEquals(testBean2, view.attributes.get("attr3")); - assertArrayEquals(new TestBean[] {testBean1, testBean2}, ((List)view.attributes.get("attr4")).toArray()); - assertNull(view.attributes.get("attr5")); + Map actual = view.attributes; + assertEquals(testBean1, actual.get("attr1")); + assertArrayEquals(new TestBean[] {testBean1, testBean2}, ((List) actual.get("attr2")).toArray()); + assertEquals(testBean2, actual.get("attr3")); + assertArrayEquals(new TestBean[] {testBean1, testBean2}, ((List) actual.get("attr4")).toArray()); + assertNull(actual.get("attr5")); } @@ -81,7 +82,9 @@ public class AbstractViewTests { private Map attributes; @Override - protected Mono renderInternal(Map renderAttributes, MediaType contentType, ServerWebExchange exchange) { + protected Mono renderInternal(Map renderAttributes, + MediaType contentType, ServerWebExchange exchange) { + this.attributes = renderAttributes; return Mono.empty(); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/JRubyScriptTemplateTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/JRubyScriptTemplateTests.java index 8c4f2bc69bc..302cb15276a 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/JRubyScriptTemplateTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/JRubyScriptTemplateTests.java @@ -45,7 +45,8 @@ public class JRubyScriptTemplateTests { Map model = new HashMap<>(); model.put("title", "Layout example"); model.put("body", "This is the body"); - MockServerHttpResponse response = renderViewWithModel("org/springframework/web/reactive/result/view/script/jruby/template.erb", model); + String url = "org/springframework/web/reactive/result/view/script/jruby/template.erb"; + MockServerHttpResponse response = renderViewWithModel(url, model); assertEquals("Layout example

    This is the body

    ", response.getBodyAsString().block()); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/JythonScriptTemplateTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/JythonScriptTemplateTests.java index 0b86a18ea83..957ca86ad30 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/JythonScriptTemplateTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/JythonScriptTemplateTests.java @@ -43,7 +43,8 @@ public class JythonScriptTemplateTests { Map model = new HashMap<>(); model.put("title", "Layout example"); model.put("body", "This is the body"); - MockServerHttpResponse response = renderViewWithModel("org/springframework/web/reactive/result/view/script/jython/template.html", model); + String url = "org/springframework/web/reactive/result/view/script/jython/template.html"; + MockServerHttpResponse response = renderViewWithModel(url, model); assertEquals("Layout example

    This is the body

    ", response.getBodyAsString().block()); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java index a20c7d06fae..99bee0c446e 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java @@ -46,20 +46,18 @@ public class KotlinScriptTemplateTests { public void renderTemplateWithFrenchLocale() throws Exception { Map model = new HashMap<>(); model.put("foo", "Foo"); - MockServerHttpResponse response = renderViewWithModel("org/springframework/web/reactive/result/view/script/kotlin/template.kts", - model, Locale.FRENCH, ScriptTemplatingConfiguration.class); - assertEquals("\n

    Bonjour Foo

    \n", - response.getBodyAsString().block()); + String url = "org/springframework/web/reactive/result/view/script/kotlin/template.kts"; + MockServerHttpResponse response = render(url, model, Locale.FRENCH, ScriptTemplatingConfiguration.class); + assertEquals("\n

    Bonjour Foo

    \n", response.getBodyAsString().block()); } @Test public void renderTemplateWithEnglishLocale() throws Exception { Map model = new HashMap<>(); model.put("foo", "Foo"); - MockServerHttpResponse response = renderViewWithModel("org/springframework/web/reactive/result/view/script/kotlin/template.kts", - model, Locale.ENGLISH, ScriptTemplatingConfiguration.class); - assertEquals("\n

    Hello Foo

    \n", - response.getBodyAsString().block()); + String url = "org/springframework/web/reactive/result/view/script/kotlin/template.kts"; + MockServerHttpResponse response = render(url, model, Locale.ENGLISH, ScriptTemplatingConfiguration.class); + assertEquals("\n

    Hello Foo

    \n", response.getBodyAsString().block()); } @Test @@ -69,14 +67,15 @@ public class KotlinScriptTemplateTests { model.put("hello", "Hello"); model.put("foo", "Foo"); model.put("footer", ""); - MockServerHttpResponse response = renderViewWithModel("org/springframework/web/reactive/result/view/script/kotlin/eval.kts", - model, Locale.ENGLISH, ScriptTemplatingConfigurationWithoutRenderFunction.class); + String url = "org/springframework/web/reactive/result/view/script/kotlin/eval.kts"; + Class configClass = ScriptTemplatingConfigurationWithoutRenderFunction.class; + MockServerHttpResponse response = render(url, model, Locale.ENGLISH, configClass); assertEquals("\n

    Hello Foo

    \n", response.getBodyAsString().block()); } - private MockServerHttpResponse renderViewWithModel(String viewUrl, Map model, + private MockServerHttpResponse render(String viewUrl, Map model, Locale locale, Class configuration) throws Exception { ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java index 1aca39c5db0..4882727f949 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/NashornScriptTemplateTests.java @@ -43,21 +43,24 @@ public class NashornScriptTemplateTests { Map model = new HashMap<>(); model.put("title", "Layout example"); model.put("body", "This is the body"); - MockServerHttpResponse response = renderViewWithModel("org/springframework/web/reactive/result/view/script/nashorn/template.html", - model, ScriptTemplatingConfiguration.class); + String url = "org/springframework/web/reactive/result/view/script/nashorn/template.html"; + MockServerHttpResponse response = render(url, model, ScriptTemplatingConfiguration.class); assertEquals("Layout example

    This is the body

    ", response.getBodyAsString().block()); } @Test // SPR-13453 public void renderTemplateWithUrl() throws Exception { - MockServerHttpResponse response = renderViewWithModel("org/springframework/web/reactive/result/view/script/nashorn/template.html", - null, ScriptTemplatingWithUrlConfiguration.class); - assertEquals("Check url parameter

    org/springframework/web/reactive/result/view/script/nashorn/template.html

    ", + String url = "org/springframework/web/reactive/result/view/script/nashorn/template.html"; + Class configClass = ScriptTemplatingWithUrlConfiguration.class; + MockServerHttpResponse response = render(url, null, configClass); + assertEquals("Check url parameter

    " + url + "

    ", response.getBodyAsString().block()); } - private MockServerHttpResponse renderViewWithModel(String viewUrl, Map model, Class configuration) throws Exception { + private MockServerHttpResponse render(String viewUrl, Map model, + Class configuration) throws Exception { + ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/")); view.renderInternal(model, MediaType.TEXT_HTML, exchange).block(); diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/render.kts b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/render.kts index 2bf9bfb5137..e33e6cae8cc 100644 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/render.kts +++ b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/render.kts @@ -1,7 +1,8 @@ -import javax.script.* -import org.springframework.web.reactive.result.view.script.RenderingContext -import org.springframework.context.support.ResourceBundleMessageSource import org.springframework.beans.factory.getBean +import org.springframework.context.support.ResourceBundleMessageSource +import org.springframework.web.reactive.result.view.script.RenderingContext +import javax.script.ScriptEngineManager +import javax.script.SimpleBindings fun render(template: String, model: Map, renderingContext: RenderingContext): String { val engine = ScriptEngineManager().getEngineByName("kotlin") diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/View.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/View.java index aa452b24b13..8598e83f841 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/View.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/View.java @@ -90,6 +90,7 @@ public interface View { * @param response HTTP response we are building * @throws Exception if rendering failed */ - void render(@Nullable Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; + void render(@Nullable Map model, + HttpServletRequest request, HttpServletResponse response) throws Exception; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index 7949c16ad56..ffbc74610de 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -163,26 +163,34 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { public static final String CONTENT_NEGOTIATION_MANAGER_BEAN_NAME = "mvcContentNegotiationManager"; private static final boolean javaxValidationPresent = - ClassUtils.isPresent("javax.validation.Validator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + ClassUtils.isPresent("javax.validation.Validator", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); private static boolean romePresent = - ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); private static final boolean jaxb2Present = - ClassUtils.isPresent("javax.xml.bind.Binder", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + ClassUtils.isPresent("javax.xml.bind.Binder", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); private static final boolean jackson2Present = - ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()) && - ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()) && + ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); private static final boolean jackson2XmlPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); private static final boolean jackson2SmilePresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); private static final boolean jackson2CborPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); private static final boolean gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); @@ -213,8 +221,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { configurePathMatchingProperties(handlerMappingDef, element, parserContext); readerContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME , handlerMappingDef); - RuntimeBeanReference corsConfigurationsRef = MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source); - handlerMappingDef.getPropertyValues().add("corsConfigurations", corsConfigurationsRef); + RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source); + handlerMappingDef.getPropertyValues().add("corsConfigurations", corsRef); RuntimeBeanReference conversionService = getConversionService(element, source, parserContext); RuntimeBeanReference validator = getValidator(element, source, parserContext); @@ -282,43 +290,41 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { mappedCsInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, csInterceptorDef); String mappedInterceptorName = readerContext.registerWithGeneratedName(mappedCsInterceptorDef); - RootBeanDefinition exceptionHandlerExceptionResolver = new RootBeanDefinition(ExceptionHandlerExceptionResolver.class); - exceptionHandlerExceptionResolver.setSource(source); - exceptionHandlerExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - exceptionHandlerExceptionResolver.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager); - exceptionHandlerExceptionResolver.getPropertyValues().add("messageConverters", messageConverters); - exceptionHandlerExceptionResolver.getPropertyValues().add("order", 0); - addResponseBodyAdvice(exceptionHandlerExceptionResolver); + RootBeanDefinition exceptionResolver = new RootBeanDefinition(ExceptionHandlerExceptionResolver.class); + exceptionResolver.setSource(source); + exceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + exceptionResolver.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager); + exceptionResolver.getPropertyValues().add("messageConverters", messageConverters); + exceptionResolver.getPropertyValues().add("order", 0); + addResponseBodyAdvice(exceptionResolver); if (argumentResolvers != null) { - exceptionHandlerExceptionResolver.getPropertyValues().add("customArgumentResolvers", argumentResolvers); + exceptionResolver.getPropertyValues().add("customArgumentResolvers", argumentResolvers); } if (returnValueHandlers != null) { - exceptionHandlerExceptionResolver.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers); + exceptionResolver.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers); } - String methodExceptionResolverName = readerContext.registerWithGeneratedName(exceptionHandlerExceptionResolver); + String methodExceptionResolverName = readerContext.registerWithGeneratedName(exceptionResolver); - RootBeanDefinition responseStatusExceptionResolver = new RootBeanDefinition(ResponseStatusExceptionResolver.class); - responseStatusExceptionResolver.setSource(source); - responseStatusExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - responseStatusExceptionResolver.getPropertyValues().add("order", 1); - String responseStatusExceptionResolverName = - readerContext.registerWithGeneratedName(responseStatusExceptionResolver); + RootBeanDefinition statusExceptionResolver = new RootBeanDefinition(ResponseStatusExceptionResolver.class); + statusExceptionResolver.setSource(source); + statusExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + statusExceptionResolver.getPropertyValues().add("order", 1); + String statusExResolverName = readerContext.registerWithGeneratedName(statusExceptionResolver); RootBeanDefinition defaultExceptionResolver = new RootBeanDefinition(DefaultHandlerExceptionResolver.class); defaultExceptionResolver.setSource(source); defaultExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); defaultExceptionResolver.getPropertyValues().add("order", 2); - String defaultExceptionResolverName = - readerContext.registerWithGeneratedName(defaultExceptionResolver); + String defaultExResolverName = readerContext.registerWithGeneratedName(defaultExceptionResolver); parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME)); parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); parserContext.registerComponent(new BeanComponentDefinition(uriCompContribDef, uriCompContribName)); - parserContext.registerComponent(new BeanComponentDefinition(exceptionHandlerExceptionResolver, methodExceptionResolverName)); - parserContext.registerComponent(new BeanComponentDefinition(responseStatusExceptionResolver, responseStatusExceptionResolverName)); - parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExceptionResolverName)); + parserContext.registerComponent(new BeanComponentDefinition(exceptionResolver, methodExceptionResolverName)); + parserContext.registerComponent(new BeanComponentDefinition(statusExceptionResolver, statusExResolverName)); + parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExResolverName)); parserContext.registerComponent(new BeanComponentDefinition(mappedCsInterceptorDef, mappedInterceptorName)); // Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off" @@ -592,7 +598,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } if (jackson2XmlPresent) { - RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2XmlHttpMessageConverter.class, source); + Class type = MappingJackson2XmlHttpMessageConverter.class; + RootBeanDefinition jacksonConverterDef = createConverterDefinition(type, source); GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source); jacksonFactoryDef.getPropertyValues().add("createXmlMapper", true); jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef); @@ -603,7 +610,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } if (jackson2Present) { - RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2HttpMessageConverter.class, source); + Class type = MappingJackson2HttpMessageConverter.class; + RootBeanDefinition jacksonConverterDef = createConverterDefinition(type, source); GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source); jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef); messageConverters.add(jacksonConverterDef); @@ -613,14 +621,16 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } if (jackson2SmilePresent) { - RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2SmileHttpMessageConverter.class, source); + Class type = MappingJackson2SmileHttpMessageConverter.class; + RootBeanDefinition jacksonConverterDef = createConverterDefinition(type, source); GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source); jacksonFactoryDef.getPropertyValues().add("factory", new SmileFactory()); jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef); messageConverters.add(jacksonConverterDef); } if (jackson2CborPresent) { - RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2CborHttpMessageConverter.class, source); + Class type = MappingJackson2CborHttpMessageConverter.class; + RootBeanDefinition jacksonConverterDef = createConverterDefinition(type, source); GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source); jacksonFactoryDef.getPropertyValues().add("factory", new CBORFactory()); jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java index e62c80b58b9..752857842a7 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java @@ -43,9 +43,9 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser { @Override @Nullable - public BeanDefinition parse(Element element, ParserContext parserContext) { - CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element)); - parserContext.pushContainingComponent(compDefinition); + public BeanDefinition parse(Element element, ParserContext context) { + context.pushContainingComponent( + new CompositeComponentDefinition(element.getTagName(), context.extractSource(element))); RuntimeBeanReference pathMatcherRef = null; if (element.hasAttribute("path-matcher")) { @@ -55,7 +55,7 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser { List interceptors = DomUtils.getChildElementsByTagName(element, "bean", "ref", "interceptor"); for (Element interceptor : interceptors) { RootBeanDefinition mappedInterceptorDef = new RootBeanDefinition(MappedInterceptor.class); - mappedInterceptorDef.setSource(parserContext.extractSource(interceptor)); + mappedInterceptorDef.setSource(context.extractSource(interceptor)); mappedInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); ManagedList includePatterns = null; @@ -65,10 +65,10 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser { includePatterns = getIncludePatterns(interceptor, "mapping"); excludePatterns = getIncludePatterns(interceptor, "exclude-mapping"); Element beanElem = DomUtils.getChildElementsByTagName(interceptor, "bean", "ref").get(0); - interceptorBean = parserContext.getDelegate().parsePropertySubElement(beanElem, null); + interceptorBean = context.getDelegate().parsePropertySubElement(beanElem, null); } else { - interceptorBean = parserContext.getDelegate().parsePropertySubElement(interceptor, null); + interceptorBean = context.getDelegate().parsePropertySubElement(interceptor, null); } mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, includePatterns); mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, excludePatterns); @@ -78,11 +78,11 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser { mappedInterceptorDef.getPropertyValues().add("pathMatcher", pathMatcherRef); } - String beanName = parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptorDef); - parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, beanName)); + String beanName = context.getReaderContext().registerWithGeneratedName(mappedInterceptorDef); + context.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, beanName)); } - parserContext.popAndRegisterContainingComponent(); + context.popAndRegisterContainingComponent(); return null; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java index 966925f77d1..37b3c3479b0 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java @@ -122,16 +122,16 @@ abstract class MvcNamespaceUtils { * Registers an {@link HttpRequestHandlerAdapter} under a well-known * name unless already registered. */ - private static void registerBeanNameUrlHandlerMapping(ParserContext parserContext, @Nullable Object source) { - if (!parserContext.getRegistry().containsBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME)){ - RootBeanDefinition beanNameMappingDef = new RootBeanDefinition(BeanNameUrlHandlerMapping.class); - beanNameMappingDef.setSource(source); - beanNameMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - beanNameMappingDef.getPropertyValues().add("order", 2); // consistent with WebMvcConfigurationSupport - RuntimeBeanReference corsConfigurationsRef = MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source); - beanNameMappingDef.getPropertyValues().add("corsConfigurations", corsConfigurationsRef); - parserContext.getRegistry().registerBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME, beanNameMappingDef); - parserContext.registerComponent(new BeanComponentDefinition(beanNameMappingDef, BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME)); + private static void registerBeanNameUrlHandlerMapping(ParserContext context, @Nullable Object source) { + if (!context.getRegistry().containsBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME)){ + RootBeanDefinition mappingDef = new RootBeanDefinition(BeanNameUrlHandlerMapping.class); + mappingDef.setSource(source); + mappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + mappingDef.getPropertyValues().add("order", 2); // consistent with WebMvcConfigurationSupport + RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, context, source); + mappingDef.getPropertyValues().add("corsConfigurations", corsRef); + context.getRegistry().registerBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME, mappingDef); + context.registerComponent(new BeanComponentDefinition(mappingDef, BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME)); } } @@ -139,13 +139,13 @@ abstract class MvcNamespaceUtils { * Registers an {@link HttpRequestHandlerAdapter} under a well-known * name unless already registered. */ - private static void registerHttpRequestHandlerAdapter(ParserContext parserContext, @Nullable Object source) { - if (!parserContext.getRegistry().containsBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME)) { - RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(HttpRequestHandlerAdapter.class); - handlerAdapterDef.setSource(source); - handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - parserContext.getRegistry().registerBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME, handlerAdapterDef); - parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME)); + private static void registerHttpRequestHandlerAdapter(ParserContext context, @Nullable Object source) { + if (!context.getRegistry().containsBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME)) { + RootBeanDefinition adapterDef = new RootBeanDefinition(HttpRequestHandlerAdapter.class); + adapterDef.setSource(source); + adapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + context.getRegistry().registerBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME, adapterDef); + context.registerComponent(new BeanComponentDefinition(adapterDef, HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME)); } } @@ -153,13 +153,13 @@ abstract class MvcNamespaceUtils { * Registers a {@link SimpleControllerHandlerAdapter} under a well-known * name unless already registered. */ - private static void registerSimpleControllerHandlerAdapter(ParserContext parserContext, @Nullable Object source) { - if (!parserContext.getRegistry().containsBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME)) { - RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class); - handlerAdapterDef.setSource(source); - handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - parserContext.getRegistry().registerBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME, handlerAdapterDef); - parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME)); + private static void registerSimpleControllerHandlerAdapter(ParserContext cxt, @Nullable Object source) { + if (!cxt.getRegistry().containsBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME)) { + RootBeanDefinition beanDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class); + beanDef.setSource(source); + beanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + cxt.getRegistry().registerBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME, beanDef); + cxt.registerComponent(new BeanComponentDefinition(beanDef, SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME)); } } @@ -171,21 +171,21 @@ abstract class MvcNamespaceUtils { */ public static RuntimeBeanReference registerCorsConfigurations( @Nullable Map corsConfigurations, - ParserContext parserContext, @Nullable Object source) { + ParserContext context, @Nullable Object source) { - if (!parserContext.getRegistry().containsBeanDefinition(CORS_CONFIGURATION_BEAN_NAME)) { - RootBeanDefinition corsConfigurationsDef = new RootBeanDefinition(LinkedHashMap.class); - corsConfigurationsDef.setSource(source); - corsConfigurationsDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + if (!context.getRegistry().containsBeanDefinition(CORS_CONFIGURATION_BEAN_NAME)) { + RootBeanDefinition corsDef = new RootBeanDefinition(LinkedHashMap.class); + corsDef.setSource(source); + corsDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); if (corsConfigurations != null) { - corsConfigurationsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations); + corsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations); } - parserContext.getReaderContext().getRegistry().registerBeanDefinition(CORS_CONFIGURATION_BEAN_NAME, corsConfigurationsDef); - parserContext.registerComponent(new BeanComponentDefinition(corsConfigurationsDef, CORS_CONFIGURATION_BEAN_NAME)); + context.getReaderContext().getRegistry().registerBeanDefinition(CORS_CONFIGURATION_BEAN_NAME, corsDef); + context.registerComponent(new BeanComponentDefinition(corsDef, CORS_CONFIGURATION_BEAN_NAME)); } else if (corsConfigurations != null) { - BeanDefinition corsConfigurationsDef = parserContext.getRegistry().getBeanDefinition(CORS_CONFIGURATION_BEAN_NAME); - corsConfigurationsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations); + BeanDefinition corsDef = context.getRegistry().getBeanDefinition(CORS_CONFIGURATION_BEAN_NAME); + corsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations); } return new RuntimeBeanReference(CORS_CONFIGURATION_BEAN_NAME); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java index 255c8b42823..c1aa6e023d5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java @@ -87,12 +87,12 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { @Override - public BeanDefinition parse(Element element, ParserContext parserContext) { - Object source = parserContext.extractSource(element); + public BeanDefinition parse(Element element, ParserContext context) { + Object source = context.extractSource(element); - registerUrlProvider(parserContext, source); + registerUrlProvider(context, source); - String resourceHandlerName = registerResourceHandler(parserContext, element, source); + String resourceHandlerName = registerResourceHandler(context, element, source); if (resourceHandlerName == null) { return null; } @@ -100,13 +100,13 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { Map urlMap = new ManagedMap<>(); String resourceRequestPath = element.getAttribute("mapping"); if (!StringUtils.hasText(resourceRequestPath)) { - parserContext.getReaderContext().error("The 'mapping' attribute is required.", parserContext.extractSource(element)); + context.getReaderContext().error("The 'mapping' attribute is required.", context.extractSource(element)); return null; } urlMap.put(resourceRequestPath, resourceHandlerName); - RuntimeBeanReference pathMatcherRef = MvcNamespaceUtils.registerPathMatcher(null, parserContext, source); - RuntimeBeanReference pathHelperRef = MvcNamespaceUtils.registerUrlPathHelper(null, parserContext, source); + RuntimeBeanReference pathMatcherRef = MvcNamespaceUtils.registerPathMatcher(null, context, source); + RuntimeBeanReference pathHelperRef = MvcNamespaceUtils.registerUrlPathHelper(null, context, source); RootBeanDefinition handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class); handlerMappingDef.setSource(source); @@ -114,20 +114,21 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { handlerMappingDef.getPropertyValues().add("urlMap", urlMap); handlerMappingDef.getPropertyValues().add("pathMatcher", pathMatcherRef).add("urlPathHelper", pathHelperRef); - String order = element.getAttribute("order"); + String orderValue = element.getAttribute("order"); // Use a default of near-lowest precedence, still allowing for even lower precedence in other mappings - handlerMappingDef.getPropertyValues().add("order", StringUtils.hasText(order) ? order : Ordered.LOWEST_PRECEDENCE - 1); + Object order = StringUtils.hasText(orderValue) ? orderValue : Ordered.LOWEST_PRECEDENCE - 1; + handlerMappingDef.getPropertyValues().add("order", order); - RuntimeBeanReference corsConfigurationsRef = MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source); - handlerMappingDef.getPropertyValues().add("corsConfigurations", corsConfigurationsRef); + RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, context, source); + handlerMappingDef.getPropertyValues().add("corsConfigurations", corsRef); - String beanName = parserContext.getReaderContext().generateBeanName(handlerMappingDef); - parserContext.getRegistry().registerBeanDefinition(beanName, handlerMappingDef); - parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, beanName)); + String beanName = context.getReaderContext().generateBeanName(handlerMappingDef); + context.getRegistry().registerBeanDefinition(beanName, handlerMappingDef); + context.registerComponent(new BeanComponentDefinition(handlerMappingDef, beanName)); // Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off" // Register HttpRequestHandlerAdapter - MvcNamespaceUtils.registerDefaultComponents(parserContext, source); + MvcNamespaceUtils.registerDefaultComponents(context, source); return null; } @@ -155,10 +156,11 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { } @Nullable - private String registerResourceHandler(ParserContext parserContext, Element element, @Nullable Object source) { + private String registerResourceHandler(ParserContext context, Element element, @Nullable Object source) { String locationAttr = element.getAttribute("location"); if (!StringUtils.hasText(locationAttr)) { - parserContext.getReaderContext().error("The 'location' attribute is required.", parserContext.extractSource(element)); + String message = "The 'location' attribute is required."; + context.getReaderContext().error(message, context.extractSource(element)); return null; } @@ -185,17 +187,17 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { Element resourceChainElement = DomUtils.getChildElementByTagName(element, "resource-chain"); if (resourceChainElement != null) { - parseResourceChain(resourceHandlerDef, parserContext, resourceChainElement, source); + parseResourceChain(resourceHandlerDef, context, resourceChainElement, source); } - Object manager = MvcNamespaceUtils.getContentNegotiationManager(parserContext); + Object manager = MvcNamespaceUtils.getContentNegotiationManager(context); if (manager != null) { values.add("contentNegotiationManager", manager); } - String beanName = parserContext.getReaderContext().generateBeanName(resourceHandlerDef); - parserContext.getRegistry().registerBeanDefinition(beanName, resourceHandlerDef); - parserContext.registerComponent(new BeanComponentDefinition(resourceHandlerDef, beanName)); + String beanName = context.getReaderContext().generateBeanName(resourceHandlerDef); + context.getRegistry().registerBeanDefinition(beanName, resourceHandlerDef); + context.registerComponent(new BeanComponentDefinition(resourceHandlerDef, beanName)); return beanName; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java index d5009b9e942..85bed79c795 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java @@ -72,7 +72,8 @@ public class ViewResolversBeanDefinitionParser implements BeanDefinitionParser { ManagedList resolvers = new ManagedList<>(4); resolvers.setSource(context.extractSource(element)); - String[] names = new String[] {"jsp", "tiles", "bean-name", "freemarker", "groovy", "script-template", "bean", "ref"}; + String[] names = new String[] { + "jsp", "tiles", "bean-name", "freemarker", "groovy", "script-template", "bean", "ref"}; for (Element resolverElement : DomUtils.getChildElementsByTagName(element, names)) { String name = resolverElement.getLocalName(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/AsyncSupportConfigurer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/AsyncSupportConfigurer.java index ea10dd257be..5a25caff7ba 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/AsyncSupportConfigurer.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/AsyncSupportConfigurer.java @@ -96,7 +96,9 @@ public class AsyncSupportConfigurer { * execution that starts when a controller returns a {@link DeferredResult}. * @param interceptors the interceptors to register */ - public AsyncSupportConfigurer registerDeferredResultInterceptors(DeferredResultProcessingInterceptor... interceptors) { + public AsyncSupportConfigurer registerDeferredResultInterceptors( + DeferredResultProcessingInterceptor... interceptors) { + this.deferredResultInterceptors.addAll(Arrays.asList(interceptors)); return this; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index d8eb43f8aa4..c5e1242e98b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -181,17 +181,22 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv ClassUtils.isPresent("javax.xml.bind.Binder", WebMvcConfigurationSupport.class.getClassLoader()); private static final boolean jackson2Present = - ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", WebMvcConfigurationSupport.class.getClassLoader()) && - ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", WebMvcConfigurationSupport.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", + WebMvcConfigurationSupport.class.getClassLoader()) && + ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", + WebMvcConfigurationSupport.class.getClassLoader()); private static final boolean jackson2XmlPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", WebMvcConfigurationSupport.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", + WebMvcConfigurationSupport.class.getClassLoader()); private static final boolean jackson2SmilePresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", WebMvcConfigurationSupport.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", + WebMvcConfigurationSupport.class.getClassLoader()); private static final boolean jackson2CborPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", WebMvcConfigurationSupport.class.getClassLoader()); + ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", + WebMvcConfigurationSupport.class.getClassLoader()); private static final boolean gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", WebMvcConfigurationSupport.class.getClassLoader()); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java index 4bc981f872c..507f68971f1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java @@ -278,7 +278,9 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i * @param request the request to expose the path to * @see #PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE */ - protected void exposePathWithinMapping(String bestMatchingPattern, String pathWithinMapping, HttpServletRequest request) { + protected void exposePathWithinMapping(String bestMatchingPattern, String pathWithinMapping, + HttpServletRequest request) { + request.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, bestMatchingPattern); request.setAttribute(PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, pathWithinMapping); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/AbstractController.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/AbstractController.java index ffdef0e84ce..fa35000f102 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/AbstractController.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/AbstractController.java @@ -39,7 +39,8 @@ import org.springframework.web.util.WebUtils; * is not support) *
  10. If session is required, try to get it (ServletException if not found)
  11. *
  12. Set caching headers if needed according to the cacheSeconds property
  13. - *
  14. Call abstract method {@link #handleRequestInternal(HttpServletRequest, HttpServletResponse) handleRequestInternal()} + *
  15. Call abstract method + * {@link #handleRequestInternal(HttpServletRequest, HttpServletResponse) handleRequestInternal()} * (optionally synchronizing around the call on the HttpSession), * which should be implemented by extending classes to provide actual * functionality to return {@link org.springframework.web.servlet.ModelAndView ModelAndView} objects.
  16. diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java index d69b0624d3b..f9a97bc3819 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java @@ -71,8 +71,9 @@ public final class RequestMappingInfo implements RequestCondition custom) { this.name = (StringUtils.hasText(name) ? name : null); @@ -88,8 +89,9 @@ public final class RequestMappingInfo implements RequestCondition custom) { this(null, patterns, methods, params, headers, consumes, produces, custom); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java index 4ea84aac4aa..2755d00b535 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java @@ -356,9 +356,11 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe } } - private List getAcceptableMediaTypes(HttpServletRequest request) throws HttpMediaTypeNotAcceptableException { - List mediaTypes = this.contentNegotiationManager.resolveMediaTypes(new ServletWebRequest(request)); - return (mediaTypes.isEmpty() ? Collections.singletonList(MediaType.ALL) : mediaTypes); + private List getAcceptableMediaTypes(HttpServletRequest request) + throws HttpMediaTypeNotAcceptableException { + + List types = this.contentNegotiationManager.resolveMediaTypes(new ServletWebRequest(request)); + return (types.isEmpty() ? Collections.singletonList(MediaType.ALL) : types); } /** diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java index c35fb3bd93f..1e0bc98a560 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java @@ -243,13 +243,13 @@ public class HttpEntityMethodProcessor extends AbstractMessageConverterMethodPro return entityHeadersVary; } - private boolean isResourceNotModified(ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage) { + private boolean isResourceNotModified(ServletServerHttpRequest request, ServletServerHttpResponse response) { ServletWebRequest servletWebRequest = - new ServletWebRequest(inputMessage.getServletRequest(), outputMessage.getServletResponse()); - HttpHeaders responseHeaders = outputMessage.getHeaders(); + new ServletWebRequest(request.getServletRequest(), response.getServletResponse()); + HttpHeaders responseHeaders = response.getHeaders(); String etag = responseHeaders.getETag(); long lastModifiedTimestamp = responseHeaders.getLastModified(); - if (inputMessage.getMethod() == HttpMethod.GET || inputMessage.getMethod() == HttpMethod.HEAD) { + if (request.getMethod() == HttpMethod.GET || request.getMethod() == HttpMethod.HEAD) { responseHeaders.remove(HttpHeaders.ETAG); responseHeaders.remove(HttpHeaders.LAST_MODIFIED); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletCookieValueMethodArgumentResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletCookieValueMethodArgumentResolver.java index 25b3de091a8..0ec66e52dc9 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletCookieValueMethodArgumentResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletCookieValueMethodArgumentResolver.java @@ -52,7 +52,9 @@ public class ServletCookieValueMethodArgumentResolver extends AbstractCookieValu @Override @Nullable - protected Object resolveName(String cookieName, MethodParameter parameter, NativeWebRequest webRequest) throws Exception { + protected Object resolveName(String cookieName, MethodParameter parameter, + NativeWebRequest webRequest) throws Exception { + HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class); Assert.state(servletRequest != null, "No HttpServletRequest"); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletWebArgumentResolverAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletWebArgumentResolverAdapter.java index e1081e6283c..19727dfb9d6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletWebArgumentResolverAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletWebArgumentResolverAdapter.java @@ -26,8 +26,9 @@ import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.method.annotation.AbstractWebArgumentResolverAdapter; /** - * A Servlet-specific {@link org.springframework.web.method.annotation.AbstractWebArgumentResolverAdapter} that creates a - * {@link NativeWebRequest} from {@link ServletRequestAttributes}. + * A Servlet-specific + * {@link org.springframework.web.method.annotation.AbstractWebArgumentResolverAdapter} + * that creates a {@link NativeWebRequest} from {@link ServletRequestAttributes}. * *

    Note: This class is provided for backwards compatibility. * However it is recommended to re-write a {@code WebArgumentResolver} as diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionsTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionsTag.java index c71698820b2..dc1908647bc 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionsTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionsTag.java @@ -70,7 +70,8 @@ import org.springframework.web.util.TagUtils; *

    disabled

    *

    false

    *

    true

    - *

    HTML Optional Attribute. Setting the value of this attribute to 'true' will disable the HTML element.

    + *

    HTML Optional Attribute. Setting the value of this attribute + * to 'true' will disable the HTML element.

    * * *

    htmlEscape

    diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/SelectedValueComparator.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/SelectedValueComparator.java index 61ad0dd858d..fb73fb01c44 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/SelectedValueComparator.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/SelectedValueComparator.java @@ -100,7 +100,8 @@ abstract class SelectedValueComparator { return selected; } - private static boolean collectionCompare(Collection boundCollection, Object candidateValue, BindStatus bindStatus) { + private static boolean collectionCompare(Collection boundCollection, Object candidateValue, + BindStatus bindStatus) { try { if (boundCollection.contains(candidateValue)) { return true; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractView.java index 67a99103947..595afaafeea 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractView.java @@ -301,7 +301,9 @@ public abstract class AbstractView extends WebApplicationObjectSupport implement * @see #renderMergedOutputModel */ @Override - public void render(@Nullable Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { + public void render(@Nullable Map model, HttpServletRequest request, + HttpServletResponse response) throws Exception { + if (logger.isTraceEnabled()) { logger.trace("Rendering view with name '" + this.beanName + "' with model " + model + " and static attributes " + this.staticAttributes); @@ -432,7 +434,9 @@ public abstract class AbstractView extends WebApplicationObjectSupport implement * @param model Map of model objects to expose * @param request current HTTP request */ - protected void exposeModelAsRequestAttributes(Map model, HttpServletRequest request) throws Exception { + protected void exposeModelAsRequestAttributes(Map model, + HttpServletRequest request) throws Exception { + model.forEach((modelName, modelValue) -> { if (modelValue != null) { request.setAttribute(modelName, modelValue); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java index 418a45452e6..c843e8c0b80 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java @@ -293,7 +293,9 @@ public class FreeMarkerView extends AbstractTemplateView { * @see #processTemplate * @see freemarker.ext.servlet.FreemarkerServlet */ - protected void doRender(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { + protected void doRender(Map model, HttpServletRequest request, + HttpServletResponse response) throws Exception { + // Expose model to JSP tags (as request attributes). exposeModelAsRequestAttributes(model, request); // Expose all standard FreeMarker hash models. @@ -315,7 +317,9 @@ public class FreeMarkerView extends AbstractTemplateView { * @param response current servlet response * @return the FreeMarker template model, as a {@link SimpleHash} or subclass thereof */ - protected SimpleHash buildTemplateModel(Map model, HttpServletRequest request, HttpServletResponse response) { + protected SimpleHash buildTemplateModel(Map model, HttpServletRequest request, + HttpServletResponse response) { + AllHttpScopesHashModel fmModel = new AllHttpScopesHashModel(getObjectWrapper(), getServletContext(), request); fmModel.put(FreemarkerServlet.KEY_JSP_TAGLIBS, this.taglibFactory); fmModel.put(FreemarkerServlet.KEY_APPLICATION, this.servletContextHashModel); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/XsltView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/XsltView.java index 60bf1a88d81..f7167ba42d4 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/XsltView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/XsltView.java @@ -202,7 +202,9 @@ public class XsltView extends AbstractUrlBasedView { * @see #setTransformerFactoryClass * @see #getTransformerFactory() */ - protected TransformerFactory newTransformerFactory(@Nullable Class transformerFactoryClass) { + protected TransformerFactory newTransformerFactory( + @Nullable Class transformerFactoryClass) { + if (transformerFactoryClass != null) { try { return ReflectionUtils.accessibleConstructor(transformerFactoryClass).newInstance(); @@ -342,7 +344,9 @@ public class XsltView extends AbstractUrlBasedView { * @see #copyOutputProperties(Transformer) * @see #configureIndentation(Transformer) */ - protected void configureTransformer(Map model, HttpServletResponse response, Transformer transformer) { + protected void configureTransformer(Map model, HttpServletResponse response, + Transformer transformer) { + copyModelParameters(model, transformer); copyOutputProperties(transformer); configureIndentation(transformer); diff --git a/spring-webmvc/src/test/java/org/springframework/web/context/ContextLoaderTests.java b/spring-webmvc/src/test/java/org/springframework/web/context/ContextLoaderTests.java index 4a1b42484ba..0405f943e27 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/context/ContextLoaderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/context/ContextLoaderTests.java @@ -68,7 +68,8 @@ public class ContextLoaderTests { ServletContextListener listener = new ContextLoaderListener(); ServletContextEvent event = new ServletContextEvent(sc); listener.contextInitialized(event); - WebApplicationContext context = (WebApplicationContext) sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); + String contextAttr = WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE; + WebApplicationContext context = (WebApplicationContext) sc.getAttribute(contextAttr); assertTrue("Correct WebApplicationContext exposed in ServletContext", context instanceof XmlWebApplicationContext); assertTrue(WebApplicationContextUtils.getRequiredWebApplicationContext(sc) instanceof XmlWebApplicationContext); LifecycleBean lb = (LifecycleBean) context.getBean("lifecycle"); @@ -80,7 +81,7 @@ public class ContextLoaderTests { assertFalse(context.containsBean("beans1.bean2")); listener.contextDestroyed(event); assertTrue("Destroyed", lb.isDestroyed()); - assertNull(sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)); + assertNull(sc.getAttribute(contextAttr)); assertNull(WebApplicationContextUtils.getWebApplicationContext(sc)); } @@ -207,7 +208,8 @@ public class ContextLoaderTests { "/org/springframework/web/context/WEB-INF/empty-context.xml"); sc.addInitParameter("someProperty", "someValue"); - sc.addInitParameter(ContextLoader.CONTEXT_INITIALIZER_CLASSES_PARAM, EnvApplicationContextInitializer.class.getName()); + sc.addInitParameter(ContextLoader.CONTEXT_INITIALIZER_CLASSES_PARAM, + EnvApplicationContextInitializer.class.getName()); ContextLoaderListener listener = new ContextLoaderListener(); listener.contextInitialized(new ServletContextEvent(sc)); } @@ -238,8 +240,10 @@ public class ContextLoaderTests { ServletContextListener listener = new ContextLoaderListener(); ServletContextEvent event = new ServletContextEvent(sc); listener.contextInitialized(event); - WebApplicationContext wc = (WebApplicationContext) sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); - assertTrue("Correct WebApplicationContext exposed in ServletContext", wc instanceof SimpleWebApplicationContext); + String contextAttr = WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE; + WebApplicationContext wc = (WebApplicationContext) sc.getAttribute(contextAttr); + assertTrue("Correct WebApplicationContext exposed in ServletContext", + wc instanceof SimpleWebApplicationContext); } @Test @@ -376,7 +380,8 @@ public class ContextLoaderTests { } - private static class TestWebContextInitializer implements ApplicationContextInitializer { + private static class TestWebContextInitializer implements + ApplicationContextInitializer { @Override public void initialize(ConfigurableWebApplicationContext applicationContext) { @@ -386,7 +391,8 @@ public class ContextLoaderTests { } - private static class EnvApplicationContextInitializer implements ApplicationContextInitializer { + private static class EnvApplicationContextInitializer + implements ApplicationContextInitializer { @Override public void initialize(ConfigurableWebApplicationContext applicationContext) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java index cbd4ca3b0d7..834a24239a6 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/DispatcherServletTests.java @@ -880,7 +880,8 @@ public class DispatcherServletTests { } - private static class TestWebContextInitializer implements ApplicationContextInitializer { + private static class TestWebContextInitializer + implements ApplicationContextInitializer { @Override public void initialize(ConfigurableWebApplicationContext applicationContext) { @@ -889,7 +890,8 @@ public class DispatcherServletTests { } - private static class OtherWebContextInitializer implements ApplicationContextInitializer { + private static class OtherWebContextInitializer + implements ApplicationContextInitializer { @Override public void initialize(ConfigurableWebApplicationContext applicationContext) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java index 8a5b2fc6b39..2e1803f05ea 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java @@ -188,8 +188,8 @@ public class MvcNamespaceTests { appContext.getServletContext().setAttribute(attributeName, appContext); handler = new TestController(); - Method method = TestController.class.getMethod("testBind", Date.class, Double.class, TestBean.class, BindingResult.class); - handlerMethod = new InvocableHandlerMethod(handler, method); + handlerMethod = new InvocableHandlerMethod(handler, TestController.class.getMethod("testBind", + Date.class, Double.class, TestBean.class, BindingResult.class)); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java index c2f67a323b4..96a50788eda 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java @@ -48,6 +48,7 @@ import org.springframework.web.util.UrlPathHelper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; @@ -98,11 +99,10 @@ public class DelegatingWebMvcConfigurationTests { @Test public void requestMappingHandlerAdapter() throws Exception { delegatingConfig.setConfigurers(Collections.singletonList(webMvcConfigurer)); - RequestMappingHandlerAdapter adapter = delegatingConfig.requestMappingHandlerAdapter(); + RequestMappingHandlerAdapter adapter = this.delegatingConfig.requestMappingHandlerAdapter(); - ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); - ConversionService initializerConversionService = initializer.getConversionService(); - assertTrue(initializer.getValidator() instanceof LocalValidatorFactoryBean); + ConfigurableWebBindingInitializer initializer = + (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); verify(webMvcConfigurer).configureMessageConverters(converters.capture()); verify(webMvcConfigurer).configureContentNegotiation(contentNegotiationConfigurer.capture()); @@ -111,7 +111,9 @@ public class DelegatingWebMvcConfigurationTests { verify(webMvcConfigurer).addReturnValueHandlers(handlers.capture()); verify(webMvcConfigurer).configureAsyncSupport(asyncConfigurer.capture()); - assertSame(conversionService.getValue(), initializerConversionService); + assertNotNull(initializer); + assertSame(conversionService.getValue(), initializer.getConversionService()); + assertTrue(initializer.getValidator() instanceof LocalValidatorFactoryBean); assertEquals(0, resolvers.getValue().size()); assertEquals(0, handlers.getValue().size()); assertEquals(converters.getValue(), adapter.getMessageConverters()); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/InterceptorRegistryTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/InterceptorRegistryTests.java index 4eab8a4ece5..693737118cd 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/InterceptorRegistryTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/InterceptorRegistryTests.java @@ -175,7 +175,9 @@ public class InterceptorRegistryTests { return result; } - private void verifyWebInterceptor(HandlerInterceptor interceptor, TestWebRequestInterceptor webInterceptor) throws Exception { + private void verifyWebInterceptor(HandlerInterceptor interceptor, + TestWebRequestInterceptor webInterceptor) throws Exception { + assertTrue(interceptor instanceof WebRequestHandlerInterceptorAdapter); interceptor.preHandle(this.request, this.response, null); assertTrue(webInterceptor.preHandleInvoked); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java index fa9e85e7098..929286c4424 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java @@ -224,7 +224,9 @@ public class WebMvcConfigurationSupportExtensionTests { public void webBindingInitializer() throws Exception { RequestMappingHandlerAdapter adapter = this.config.requestMappingHandlerAdapter(); - ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); + ConfigurableWebBindingInitializer initializer = + (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); + assertNotNull(initializer); BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(null, ""); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/CorsAbstractHandlerMappingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/CorsAbstractHandlerMappingTests.java index 0a6c680ee7b..1a91186a983 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/CorsAbstractHandlerMappingTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/CorsAbstractHandlerMappingTests.java @@ -189,7 +189,9 @@ public class CorsAbstractHandlerMappingTests { } @Override - public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + public void handleRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + response.setStatus(HttpStatus.OK.value()); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/HandlerMappingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/HandlerMappingTests.java index 9088e8c66d8..78525c4136c 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/HandlerMappingTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/HandlerMappingTests.java @@ -56,18 +56,18 @@ public class HandlerMappingTests { @Test public void orderedInterceptors() throws Exception { - MappedInterceptor firstMappedInterceptor = new MappedInterceptor(new String[]{"/**"}, Mockito.mock(HandlerInterceptor.class)); - HandlerInterceptor secondHandlerInterceptor = Mockito.mock(HandlerInterceptor.class); - MappedInterceptor thirdMappedInterceptor = new MappedInterceptor(new String[]{"/**"}, Mockito.mock(HandlerInterceptor.class)); - HandlerInterceptor fourthHandlerInterceptor = Mockito.mock(HandlerInterceptor.class); - - this.handlerMapping.setInterceptors(new Object[]{firstMappedInterceptor, secondHandlerInterceptor, - thirdMappedInterceptor, fourthHandlerInterceptor}); + HandlerInterceptor i1 = Mockito.mock(HandlerInterceptor.class); + MappedInterceptor mappedInterceptor1 = new MappedInterceptor(new String[]{"/**"}, i1); + HandlerInterceptor i2 = Mockito.mock(HandlerInterceptor.class); + HandlerInterceptor i3 = Mockito.mock(HandlerInterceptor.class); + MappedInterceptor mappedInterceptor3 = new MappedInterceptor(new String[]{"/**"}, i3); + HandlerInterceptor i4 = Mockito.mock(HandlerInterceptor.class); + + this.handlerMapping.setInterceptors(mappedInterceptor1, i2, mappedInterceptor3, i4); this.handlerMapping.setApplicationContext(this.context); HandlerExecutionChain chain = this.handlerMapping.getHandlerExecutionChain(new SimpleHandler(), this.request); - Assert.assertThat(chain.getInterceptors(), - Matchers.arrayContaining(firstMappedInterceptor.getInterceptor(), secondHandlerInterceptor, - thirdMappedInterceptor.getInterceptor(), fourthHandlerInterceptor)); + Assert.assertThat(chain.getInterceptors(), Matchers.arrayContaining( + mappedInterceptor1.getInterceptor(), i2, mappedInterceptor3.getInterceptor(), i4)); } class TestHandlerMapping extends AbstractHandlerMapping { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/PathMatchingUrlHandlerMappingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/PathMatchingUrlHandlerMappingTests.java index 14d3206a21b..8689cf5ed90 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/PathMatchingUrlHandlerMappingTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/handler/PathMatchingUrlHandlerMappingTests.java @@ -237,7 +237,8 @@ public class PathMatchingUrlHandlerMappingTests { MockHttpServletRequest req = new MockHttpServletRequest("GET", "/show.html"); HandlerExecutionChain hec = getHandler(req); assertTrue("Handler is correct bean", hec != null && hec.getHandler() == bean); - assertEquals("Mapping not exposed", "show.html", req.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)); + assertEquals("Mapping not exposed", "show.html", + req.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)); } private HandlerExecutionChain getHandler(MockHttpServletRequest req) throws Exception { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/UrlFilenameViewControllerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/UrlFilenameViewControllerTests.java index 2f9db2a5091..6bd2d94699a 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/UrlFilenameViewControllerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/UrlFilenameViewControllerTests.java @@ -152,16 +152,16 @@ public class UrlFilenameViewControllerTests { public void settingPrefixToNullCausesEmptyStringToBeUsed() throws Exception { UrlFilenameViewController ctrl = new UrlFilenameViewController(); ctrl.setPrefix(null); - assertNotNull("When setPrefix(..) is called with a null argument, the empty string value must be used instead.", ctrl.getPrefix()); - assertEquals("When setPrefix(..) is called with a null argument, the empty string value must be used instead.", "", ctrl.getPrefix()); + assertNotNull("For setPrefix(..) with null, the empty string must be used instead.", ctrl.getPrefix()); + assertEquals("For setPrefix(..) with null, the empty string must be used instead.", "", ctrl.getPrefix()); } @Test public void settingSuffixToNullCausesEmptyStringToBeUsed() throws Exception { UrlFilenameViewController ctrl = new UrlFilenameViewController(); ctrl.setSuffix(null); - assertNotNull("When setSuffix(..) is called with a null argument, the empty string value must be used instead.", ctrl.getSuffix()); - assertEquals("When setSuffix(..) is called with a null argument, the empty string value must be used instead.", "", ctrl.getSuffix()); + assertNotNull("For setPrefix(..) with null, the empty string must be used instead.", ctrl.getSuffix()); + assertEquals("For setPrefix(..) with null, the empty string must be used instead.", "", ctrl.getSuffix()); } /** diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/AbstractServletHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/AbstractServletHandlerMethodTests.java index 0992df5c878..3fb0c4f8557 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/AbstractServletHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/AbstractServletHandlerMethodTests.java @@ -87,14 +87,14 @@ public abstract class AbstractServletHandlerMethodTests { RootBeanDefinition mappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class); mappingDef.getPropertyValues().add("removeSemicolonContent", "false"); wac.registerBeanDefinition("handlerMapping", mappingDef); - - wac.registerBeanDefinition("handlerAdapter", new RootBeanDefinition(RequestMappingHandlerAdapter.class)); - - wac.registerBeanDefinition("requestMappingResolver", new RootBeanDefinition(ExceptionHandlerExceptionResolver.class)); - - wac.registerBeanDefinition("responseStatusResolver", new RootBeanDefinition(ResponseStatusExceptionResolver.class)); - - wac.registerBeanDefinition("defaultResolver", new RootBeanDefinition(DefaultHandlerExceptionResolver.class)); + wac.registerBeanDefinition("handlerAdapter", + new RootBeanDefinition(RequestMappingHandlerAdapter.class)); + wac.registerBeanDefinition("requestMappingResolver", + new RootBeanDefinition(ExceptionHandlerExceptionResolver.class)); + wac.registerBeanDefinition("responseStatusResolver", + new RootBeanDefinition(ResponseStatusExceptionResolver.class)); + wac.registerBeanDefinition("defaultResolver", + new RootBeanDefinition(DefaultHandlerExceptionResolver.class)); if (initializer != null) { initializer.initialize(wac); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/CrossOriginTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/CrossOriginTests.java index 3d7088aa3c4..de41d5a4397 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/CrossOriginTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/CrossOriginTests.java @@ -39,6 +39,8 @@ import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.context.support.StaticWebApplicationContext; @@ -315,48 +317,52 @@ public class CrossOriginTests { @Controller private static class MethodLevelController { - @RequestMapping(path = "/no", method = RequestMethod.GET) + @GetMapping("/no") public void noAnnotation() { } - @RequestMapping(path = "/no", method = RequestMethod.POST) + @PostMapping("/no") public void noAnnotationPost() { } @CrossOrigin - @RequestMapping(path = "/default", method = RequestMethod.GET) + @GetMapping(path = "/default") public void defaultAnnotation() { } @CrossOrigin - @RequestMapping(path = "/default", method = RequestMethod.GET, params = "q") + @GetMapping(path = "/default", params = "q") public void defaultAnnotationWithParams() { } @CrossOrigin - @RequestMapping(path = "/ambiguous-header", method = RequestMethod.GET, headers = "header1=a") + @GetMapping(path = "/ambiguous-header", headers = "header1=a") public void ambigousHeader1a() { } @CrossOrigin - @RequestMapping(path = "/ambiguous-header", method = RequestMethod.GET, headers = "header1=b") + @GetMapping(path = "/ambiguous-header", headers = "header1=b") public void ambigousHeader1b() { } @CrossOrigin - @RequestMapping(path = "/ambiguous-produces", method = RequestMethod.GET, produces = "application/xml") + @GetMapping(path = "/ambiguous-produces", produces = "application/xml") public String ambigousProducesXml() { return ""; } @CrossOrigin - @RequestMapping(path = "/ambiguous-produces", method = RequestMethod.GET, produces = "application/json") + @GetMapping(path = "/ambiguous-produces", produces = "application/json") public String ambigousProducesJson() { return "{}"; } - @CrossOrigin(origins = { "http://site1.com", "http://site2.com" }, allowedHeaders = { "header1", "header2" }, - exposedHeaders = { "header3", "header4" }, methods = RequestMethod.DELETE, maxAge = 123, allowCredentials = "false") + @CrossOrigin(origins = { "http://site1.com", "http://site2.com" }, + allowedHeaders = { "header1", "header2" }, + exposedHeaders = { "header3", "header4" }, + methods = RequestMethod.DELETE, + maxAge = 123, + allowCredentials = "false") @RequestMapping(path = "/customized", method = { RequestMethod.GET, RequestMethod.POST }) public void customized() { } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HandlerMethodAnnotationDetectionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HandlerMethodAnnotationDetectionTests.java index 93d7ceb7936..f0e4e976a1b 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HandlerMethodAnnotationDetectionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HandlerMethodAnnotationDetectionTests.java @@ -395,7 +395,8 @@ public class HandlerMethodAnnotationDetectionTests { public abstract String handleException(Exception exception); } - static class ParameterizedSubclassOverridesDefaultMappings extends GenericAbstractClassDeclaresDefaultMappings { + static class ParameterizedSubclassOverridesDefaultMappings + extends GenericAbstractClassDeclaresDefaultMappings { @Override public void initBinder(WebDataBinder dataBinder, @RequestParam("datePattern") String thePattern) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java index aa78493f46c..cbe515af129 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessorMockTests.java @@ -20,6 +20,7 @@ import java.lang.reflect.Method; import java.net.URI; import java.nio.charset.StandardCharsets; import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.Arrays; import java.util.Collections; import java.util.Date; @@ -55,6 +56,8 @@ import static java.time.Instant.*; import static java.time.format.DateTimeFormatter.*; import static org.junit.Assert.*; import static org.mockito.BDDMockito.*; +import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM; +import static org.springframework.http.MediaType.TEXT_PLAIN; import static org.springframework.web.servlet.HandlerMapping.*; /** @@ -115,15 +118,21 @@ public class HttpEntityMethodProcessorMockTests { @Before @SuppressWarnings("unchecked") public void setup() throws Exception { + stringHttpMessageConverter = mock(HttpMessageConverter.class); - given(stringHttpMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN)); + given(stringHttpMessageConverter.getSupportedMediaTypes()) + .willReturn(Collections.singletonList(TEXT_PLAIN)); + resourceMessageConverter = mock(HttpMessageConverter.class); - given(resourceMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.ALL)); + given(resourceMessageConverter.getSupportedMediaTypes()) + .willReturn(Collections.singletonList(MediaType.ALL)); + resourceRegionMessageConverter = mock(HttpMessageConverter.class); - given(resourceRegionMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.ALL)); + given(resourceRegionMessageConverter.getSupportedMediaTypes()) + .willReturn(Collections.singletonList(MediaType.ALL)); - processor = new HttpEntityMethodProcessor( - Arrays.asList(stringHttpMessageConverter, resourceMessageConverter, resourceRegionMessageConverter)); + processor = new HttpEntityMethodProcessor(Arrays.asList( + stringHttpMessageConverter, resourceMessageConverter, resourceRegionMessageConverter)); Method handle1 = getClass().getMethod("handle1", HttpEntity.class, ResponseEntity.class, Integer.TYPE, RequestEntity.class); @@ -168,7 +177,7 @@ public class HttpEntityMethodProcessorMockTests { public void shouldResolveHttpEntityArgument() throws Exception { String body = "Foo"; - MediaType contentType = MediaType.TEXT_PLAIN; + MediaType contentType = TEXT_PLAIN; servletRequest.addHeader("Content-Type", contentType.toString()); servletRequest.setContent(body.getBytes(StandardCharsets.UTF_8)); @@ -186,7 +195,7 @@ public class HttpEntityMethodProcessorMockTests { public void shouldResolveRequestEntityArgument() throws Exception { String body = "Foo"; - MediaType contentType = MediaType.TEXT_PLAIN; + MediaType contentType = TEXT_PLAIN; servletRequest.addHeader("Content-Type", contentType.toString()); servletRequest.setMethod("GET"); servletRequest.setServerName("www.example.com"); @@ -204,13 +213,14 @@ public class HttpEntityMethodProcessorMockTests { RequestEntity requestEntity = (RequestEntity) result; assertEquals("Invalid method", HttpMethod.GET, requestEntity.getMethod()); // using default port (which is 80), so do not need to append the port (-1 means ignore) - assertEquals("Invalid url", new URI("http", null, "www.example.com", -1, "/path", null, null), requestEntity.getUrl()); + URI uri = new URI("http", null, "www.example.com", -1, "/path", null, null); + assertEquals("Invalid url", uri, requestEntity.getUrl()); assertEquals("Invalid argument", body, requestEntity.getBody()); } @Test public void shouldFailResolvingWhenConverterCannotRead() throws Exception { - MediaType contentType = MediaType.TEXT_PLAIN; + MediaType contentType = TEXT_PLAIN; servletRequest.setMethod("POST"); servletRequest.addHeader("Content-Type", contentType.toString()); @@ -233,7 +243,7 @@ public class HttpEntityMethodProcessorMockTests { public void shouldHandleReturnValue() throws Exception { String body = "Foo"; ResponseEntity returnValue = new ResponseEntity<>(body, HttpStatus.OK); - MediaType accepted = MediaType.TEXT_PLAIN; + MediaType accepted = TEXT_PLAIN; servletRequest.addHeader("Accept", accepted.toString()); initStringMessageConversion(accepted); @@ -287,7 +297,8 @@ public class HttpEntityMethodProcessorMockTests { servletRequest.addHeader("Accept", accepted.toString()); given(stringHttpMessageConverter.canWrite(String.class, null)).willReturn(true); - given(stringHttpMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN)); + given(stringHttpMessageConverter.getSupportedMediaTypes()) + .willReturn(Collections.singletonList(TEXT_PLAIN)); this.thrown.expect(HttpMediaTypeNotAcceptableException.class); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); @@ -297,11 +308,12 @@ public class HttpEntityMethodProcessorMockTests { public void shouldFailHandlingWhenConverterCannotWrite() throws Exception { String body = "Foo"; ResponseEntity returnValue = new ResponseEntity<>(body, HttpStatus.OK); - MediaType accepted = MediaType.TEXT_PLAIN; + MediaType accepted = TEXT_PLAIN; servletRequest.addHeader("Accept", accepted.toString()); given(stringHttpMessageConverter.canWrite(String.class, null)).willReturn(true); - given(stringHttpMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN)); + given(stringHttpMessageConverter.getSupportedMediaTypes()) + .willReturn(Collections.singletonList(TEXT_PLAIN)); given(stringHttpMessageConverter.canWrite(String.class, accepted)).willReturn(false); this.thrown.expect(HttpMediaTypeNotAcceptableException.class); @@ -335,11 +347,11 @@ public class HttpEntityMethodProcessorMockTests { responseHeaders.set("header", "headerValue"); ResponseEntity returnValue = new ResponseEntity<>("body", responseHeaders, HttpStatus.ACCEPTED); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); ArgumentCaptor outputMessage = ArgumentCaptor.forClass(HttpOutputMessage.class); - verify(stringHttpMessageConverter).write(eq("body"), eq(MediaType.TEXT_PLAIN), outputMessage.capture()); + verify(stringHttpMessageConverter).write(eq("body"), eq(TEXT_PLAIN), outputMessage.capture()); assertTrue(mavContainer.isRequestHandled()); assertEquals("headerValue", outputMessage.getValue().getHeaders().get("header").get(0)); } @@ -348,10 +360,11 @@ public class HttpEntityMethodProcessorMockTests { public void shouldHandleLastModifiedWithHttp304() throws Exception { long currentTime = new Date().getTime(); long oneMinuteAgo = currentTime - (1000 * 60); - servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(ofEpochMilli(currentTime).atZone(GMT))); + ZonedDateTime dateTime = ofEpochMilli(currentTime).atZone(GMT); + servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(dateTime)); ResponseEntity returnValue = ResponseEntity.ok().lastModified(oneMinuteAgo).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.NOT_MODIFIED, null, null, oneMinuteAgo); @@ -363,7 +376,7 @@ public class HttpEntityMethodProcessorMockTests { servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etagValue); ResponseEntity returnValue = ResponseEntity.ok().eTag(etagValue).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.NOT_MODIFIED, null, etagValue, -1); @@ -375,7 +388,7 @@ public class HttpEntityMethodProcessorMockTests { servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, "unquoted"); ResponseEntity returnValue = ResponseEntity.ok().eTag(etagValue).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.OK, "body", etagValue, -1); @@ -386,11 +399,13 @@ public class HttpEntityMethodProcessorMockTests { long currentTime = new Date().getTime(); long oneMinuteAgo = currentTime - (1000 * 60); String etagValue = "\"deadb33f8badf00d\""; - servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(ofEpochMilli(currentTime).atZone(GMT))); + ZonedDateTime dateTime = ofEpochMilli(currentTime).atZone(GMT); + servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(dateTime)); servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etagValue); - ResponseEntity returnValue = ResponseEntity.ok().eTag(etagValue).lastModified(oneMinuteAgo).body("body"); + ResponseEntity returnValue = ResponseEntity.ok() + .eTag(etagValue).lastModified(oneMinuteAgo).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.NOT_MODIFIED, null, etagValue, oneMinuteAgo); @@ -404,7 +419,7 @@ public class HttpEntityMethodProcessorMockTests { ResponseEntity returnValue = ResponseEntity.status(HttpStatus.NOT_MODIFIED) .eTag(etagValue).lastModified(oneMinuteAgo).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.NOT_MODIFIED, null, etagValue, oneMinuteAgo); @@ -416,12 +431,13 @@ public class HttpEntityMethodProcessorMockTests { long oneMinuteAgo = currentTime - (1000 * 60); String etagValue = "\"deadb33f8badf00d\""; String changedEtagValue = "\"changed-etag-value\""; - servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(ofEpochMilli(currentTime).atZone(GMT))); + ZonedDateTime dateTime = ofEpochMilli(currentTime).atZone(GMT); + servletRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, RFC_1123_DATE_TIME.format(dateTime)); servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etagValue); ResponseEntity returnValue = ResponseEntity.ok() .eTag(changedEtagValue).lastModified(oneMinuteAgo).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.OK, null, changedEtagValue, oneMinuteAgo); @@ -435,7 +451,7 @@ public class HttpEntityMethodProcessorMockTests { servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, wildcardValue); ResponseEntity returnValue = ResponseEntity.ok().eTag(etagValue).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.OK, "body", etagValue, -1); @@ -448,7 +464,7 @@ public class HttpEntityMethodProcessorMockTests { servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, wildcardValue); ResponseEntity returnValue = ResponseEntity.ok().eTag(etagValue).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.OK, "body", etagValue, -1); @@ -461,7 +477,7 @@ public class HttpEntityMethodProcessorMockTests { servletRequest.addHeader(HttpHeaders.IF_MATCH, "ifmatch"); ResponseEntity returnValue = ResponseEntity.ok().eTag(etagValue).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.NOT_MODIFIED, null, etagValue, -1); @@ -471,10 +487,11 @@ public class HttpEntityMethodProcessorMockTests { public void shouldHandleIfNoneMatchIfUnmodifiedSince() throws Exception { String etagValue = "\"some-etag\""; servletRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etagValue); - servletRequest.addHeader(HttpHeaders.IF_UNMODIFIED_SINCE, RFC_1123_DATE_TIME.format(ofEpochMilli(new Date().getTime()).atZone(GMT))); + ZonedDateTime dateTime = ofEpochMilli(new Date().getTime()).atZone(GMT); + servletRequest.addHeader(HttpHeaders.IF_UNMODIFIED_SINCE, RFC_1123_DATE_TIME.format(dateTime)); ResponseEntity returnValue = ResponseEntity.ok().eTag(etagValue).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.NOT_MODIFIED, null, etagValue, -1); @@ -487,12 +504,12 @@ public class HttpEntityMethodProcessorMockTests { given(resourceMessageConverter.canWrite(ByteArrayResource.class, null)).willReturn(true); given(resourceMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.ALL)); - given(resourceMessageConverter.canWrite(ByteArrayResource.class, MediaType.APPLICATION_OCTET_STREAM)).willReturn(true); + given(resourceMessageConverter.canWrite(ByteArrayResource.class, APPLICATION_OCTET_STREAM)).willReturn(true); processor.handleReturnValue(returnValue, returnTypeResponseEntityResource, mavContainer, webRequest); - then(resourceMessageConverter).should(times(1)).write(any(ByteArrayResource.class), - eq(MediaType.APPLICATION_OCTET_STREAM), any(HttpOutputMessage.class)); + then(resourceMessageConverter).should(times(1)).write( + any(ByteArrayResource.class), eq(APPLICATION_OCTET_STREAM), any(HttpOutputMessage.class)); assertEquals(200, servletResponse.getStatus()); } @@ -503,12 +520,12 @@ public class HttpEntityMethodProcessorMockTests { servletRequest.addHeader("Range", "bytes=0-5"); given(resourceRegionMessageConverter.canWrite(any(), eq(null))).willReturn(true); - given(resourceRegionMessageConverter.canWrite(any(), eq(MediaType.APPLICATION_OCTET_STREAM))).willReturn(true); + given(resourceRegionMessageConverter.canWrite(any(), eq(APPLICATION_OCTET_STREAM))).willReturn(true); processor.handleReturnValue(returnValue, returnTypeResponseEntityResource, mavContainer, webRequest); then(resourceRegionMessageConverter).should(times(1)).write( - anyCollection(), eq(MediaType.APPLICATION_OCTET_STREAM), + anyCollection(), eq(APPLICATION_OCTET_STREAM), argThat(outputMessage -> outputMessage.getHeaders().getFirst(HttpHeaders.ACCEPT_RANGES) == "bytes")); assertEquals(206, servletResponse.getStatus()); } @@ -520,12 +537,12 @@ public class HttpEntityMethodProcessorMockTests { servletRequest.addHeader("Range", "illegal"); given(resourceRegionMessageConverter.canWrite(any(), eq(null))).willReturn(true); - given(resourceRegionMessageConverter.canWrite(any(), eq(MediaType.APPLICATION_OCTET_STREAM))).willReturn(true); + given(resourceRegionMessageConverter.canWrite(any(), eq(APPLICATION_OCTET_STREAM))).willReturn(true); processor.handleReturnValue(returnValue, returnTypeResponseEntityResource, mavContainer, webRequest); then(resourceRegionMessageConverter).should(never()).write( - anyCollection(), eq(MediaType.APPLICATION_OCTET_STREAM), any(HttpOutputMessage.class)); + anyCollection(), eq(APPLICATION_OCTET_STREAM), any(HttpOutputMessage.class)); assertEquals(416, servletResponse.getStatus()); } @@ -535,7 +552,7 @@ public class HttpEntityMethodProcessorMockTests { String etagValue = "\"some-etag\""; ResponseEntity returnValue = ResponseEntity.ok().header(HttpHeaders.ETAG, etagValue).body("body"); - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertConditionalResponse(HttpStatus.OK, "body", etagValue, -1); @@ -587,26 +604,28 @@ public class HttpEntityMethodProcessorMockTests { for (String value : existingValues) { servletResponse.addHeader("Vary", value); } - initStringMessageConversion(MediaType.TEXT_PLAIN); + initStringMessageConversion(TEXT_PLAIN); processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest); assertTrue(mavContainer.isRequestHandled()); assertEquals(Arrays.asList(expected), servletResponse.getHeaders("Vary")); - verify(stringHttpMessageConverter).write(eq("Foo"), eq(MediaType.TEXT_PLAIN), isA(HttpOutputMessage.class)); + verify(stringHttpMessageConverter).write(eq("Foo"), eq(TEXT_PLAIN), isA(HttpOutputMessage.class)); } private void initStringMessageConversion(MediaType accepted) { given(stringHttpMessageConverter.canWrite(String.class, null)).willReturn(true); - given(stringHttpMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN)); + given(stringHttpMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(TEXT_PLAIN)); given(stringHttpMessageConverter.canWrite(String.class, accepted)).willReturn(true); } private void assertResponseBody(String body) throws Exception { ArgumentCaptor outputMessage = ArgumentCaptor.forClass(HttpOutputMessage.class); - verify(stringHttpMessageConverter).write(eq(body), eq(MediaType.TEXT_PLAIN), outputMessage.capture()); + verify(stringHttpMessageConverter).write(eq(body), eq(TEXT_PLAIN), outputMessage.capture()); } - private void assertConditionalResponse(HttpStatus status, String body, String etag, long lastModified) throws Exception { + private void assertConditionalResponse(HttpStatus status, String body, String etag, + long lastModified) throws Exception { + assertEquals(status.value(), servletResponse.getStatus()); assertTrue(mavContainer.isRequestHandled()); if (body != null) { @@ -621,7 +640,8 @@ public class HttpEntityMethodProcessorMockTests { } if (lastModified != -1) { assertEquals(1, servletResponse.getHeaderValues(HttpHeaders.LAST_MODIFIED).size()); - assertEquals(RFC_1123_DATE_TIME.format(ofEpochMilli(lastModified).atZone(GMT)), servletResponse.getHeader(HttpHeaders.LAST_MODIFIED)); + assertEquals(RFC_1123_DATE_TIME.format(ofEpochMilli(lastModified).atZone(GMT)), + servletResponse.getHeader(HttpHeaders.LAST_MODIFIED)); } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandlerTests.java index ad368fc241f..e98b0313e05 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandlerTests.java @@ -126,7 +126,8 @@ public class ReactiveTypeHandlerTests { // RxJava 2 Single AtomicReference> ref2 = new AtomicReference<>(); io.reactivex.Single single2 = io.reactivex.Single.create(ref2::set); - testDeferredResultSubscriber(single2, io.reactivex.Single.class, forClass(String.class), () -> ref2.get().onSuccess("foo"), "foo"); + testDeferredResultSubscriber(single2, io.reactivex.Single.class, forClass(String.class), + () -> ref2.get().onSuccess("foo"), "foo"); } @Test @@ -169,7 +170,8 @@ public class ReactiveTypeHandlerTests { // RxJava 2 Single AtomicReference> ref2 = new AtomicReference<>(); io.reactivex.Single single2 = io.reactivex.Single.create(ref2::set); - testDeferredResultSubscriber(single2, io.reactivex.Single.class, forClass(String.class), () -> ref2.get().onError(ex), ex); + testDeferredResultSubscriber(single2, io.reactivex.Single.class, forClass(String.class), + () -> ref2.get().onError(ex), ex); } @Test diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestPartMethodArgumentResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestPartMethodArgumentResolverTests.java index 73a685c9d01..164e8ea58f2 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestPartMethodArgumentResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestPartMethodArgumentResolverTests.java @@ -103,7 +103,7 @@ public class RequestPartMethodArgumentResolverTests { messageConverter = mock(HttpMessageConverter.class); given(messageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN)); - resolver = new RequestPartMethodArgumentResolver(Collections.>singletonList(messageConverter)); + resolver = new RequestPartMethodArgumentResolver(Collections.singletonList(messageConverter)); reset(messageConverter); byte[] content = "doesn't matter as long as not empty".getBytes(StandardCharsets.UTF_8); @@ -492,7 +492,8 @@ public class RequestPartMethodArgumentResolverTests { ModelAndViewContainer mavContainer = new ModelAndViewContainer(); - Object actualValue = resolver.resolveArgument(optionalRequestPart, mavContainer, webRequest, new ValidatingBinderFactory()); + Object actualValue = resolver.resolveArgument( + optionalRequestPart, mavContainer, webRequest, new ValidatingBinderFactory()); assertEquals("Invalid argument value", Optional.of(simpleBean), actualValue); assertFalse("The requestHandled flag shouldn't change", mavContainer.isRequestHandled()); @@ -558,7 +559,9 @@ public class RequestPartMethodArgumentResolverTests { private final class ValidatingBinderFactory implements WebDataBinderFactory { @Override - public WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object target, String objectName) throws Exception { + public WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object target, + String objectName) throws Exception { + LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); WebDataBinder dataBinder = new WebDataBinder(target, objectName); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorMockTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorMockTests.java index d8251c32d5c..bbac31dd954 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorMockTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorMockTests.java @@ -150,7 +150,8 @@ public class RequestResponseBodyMethodProcessorMockTests { given(stringMessageConverter.canRead(String.class, contentType)).willReturn(true); given(stringMessageConverter.read(eq(String.class), isA(HttpInputMessage.class))).willReturn(body); - Object result = processor.resolveArgument(paramRequestBodyString, mavContainer, webRequest, new ValidatingBinderFactory()); + Object result = processor.resolveArgument(paramRequestBodyString, mavContainer, + webRequest, new ValidatingBinderFactory()); assertEquals("Invalid argument", body, result); assertFalse("The requestHandled flag shouldn't change", mavContainer.isRequestHandled()); @@ -185,7 +186,7 @@ public class RequestResponseBodyMethodProcessorMockTests { given(beanConverter.canRead(SimpleBean.class, contentType)).willReturn(true); given(beanConverter.read(eq(SimpleBean.class), isA(HttpInputMessage.class))).willReturn(simpleBean); - processor = new RequestResponseBodyMethodProcessor(Collections.>singletonList(beanConverter)); + processor = new RequestResponseBodyMethodProcessor(Collections.singletonList(beanConverter)); processor.resolveArgument(paramValidBean, mavContainer, webRequest, new ValidatingBinderFactory()); } @@ -220,7 +221,8 @@ public class RequestResponseBodyMethodProcessorMockTests { servletRequest.setContent(new byte[0]); given(stringMessageConverter.canRead(String.class, MediaType.TEXT_PLAIN)).willReturn(true); given(stringMessageConverter.read(eq(String.class), isA(HttpInputMessage.class))).willReturn(null); - assertNull(processor.resolveArgument(paramRequestBodyString, mavContainer, webRequest, new ValidatingBinderFactory())); + assertNull(processor.resolveArgument(paramRequestBodyString, mavContainer, + webRequest, new ValidatingBinderFactory())); } @Test @@ -228,7 +230,8 @@ public class RequestResponseBodyMethodProcessorMockTests { servletRequest.setMethod("GET"); servletRequest.setContent(new byte[0]); given(stringMessageConverter.canRead(String.class, MediaType.APPLICATION_OCTET_STREAM)).willReturn(false); - assertNull(processor.resolveArgument(paramStringNotRequired, mavContainer, webRequest, new ValidatingBinderFactory())); + assertNull(processor.resolveArgument(paramStringNotRequired, mavContainer, + webRequest, new ValidatingBinderFactory())); } @Test @@ -237,7 +240,8 @@ public class RequestResponseBodyMethodProcessorMockTests { servletRequest.setContent("body".getBytes()); given(stringMessageConverter.canRead(String.class, MediaType.TEXT_PLAIN)).willReturn(true); given(stringMessageConverter.read(eq(String.class), isA(HttpInputMessage.class))).willReturn("body"); - assertEquals("body", processor.resolveArgument(paramStringNotRequired, mavContainer, webRequest, new ValidatingBinderFactory())); + assertEquals("body", processor.resolveArgument(paramStringNotRequired, mavContainer, + webRequest, new ValidatingBinderFactory())); } @Test @@ -245,7 +249,8 @@ public class RequestResponseBodyMethodProcessorMockTests { servletRequest.setContentType("text/plain"); servletRequest.setContent(new byte[0]); given(stringMessageConverter.canRead(String.class, MediaType.TEXT_PLAIN)).willReturn(true); - assertNull(processor.resolveArgument(paramStringNotRequired, mavContainer, webRequest, new ValidatingBinderFactory())); + assertNull(processor.resolveArgument(paramStringNotRequired, mavContainer, + webRequest, new ValidatingBinderFactory())); } @Test // SPR-13417 @@ -253,7 +258,8 @@ public class RequestResponseBodyMethodProcessorMockTests { servletRequest.setContent(new byte[0]); given(stringMessageConverter.canRead(String.class, MediaType.TEXT_PLAIN)).willReturn(true); given(stringMessageConverter.canRead(String.class, MediaType.APPLICATION_OCTET_STREAM)).willReturn(false); - assertNull(processor.resolveArgument(paramStringNotRequired, mavContainer, webRequest, new ValidatingBinderFactory())); + assertNull(processor.resolveArgument(paramStringNotRequired, mavContainer, + webRequest, new ValidatingBinderFactory())); } @Test @@ -262,7 +268,8 @@ public class RequestResponseBodyMethodProcessorMockTests { servletRequest.setContent("body".getBytes()); given(stringMessageConverter.canRead(String.class, MediaType.TEXT_PLAIN)).willReturn(true); given(stringMessageConverter.read(eq(String.class), isA(HttpInputMessage.class))).willReturn("body"); - assertEquals(Optional.of("body"), processor.resolveArgument(paramOptionalString, mavContainer, webRequest, new ValidatingBinderFactory())); + assertEquals(Optional.of("body"), processor.resolveArgument(paramOptionalString, mavContainer, + webRequest, new ValidatingBinderFactory())); } @Test @@ -278,7 +285,8 @@ public class RequestResponseBodyMethodProcessorMockTests { servletRequest.setContent(new byte[0]); given(stringMessageConverter.canRead(String.class, MediaType.TEXT_PLAIN)).willReturn(true); given(stringMessageConverter.canRead(String.class, MediaType.APPLICATION_OCTET_STREAM)).willReturn(false); - assertEquals(Optional.empty(), processor.resolveArgument(paramOptionalString, mavContainer, webRequest, new ValidatingBinderFactory())); + assertEquals(Optional.empty(), processor.resolveArgument(paramOptionalString, mavContainer, + webRequest, new ValidatingBinderFactory())); } @Test @@ -302,7 +310,8 @@ public class RequestResponseBodyMethodProcessorMockTests { String body = "Foo"; servletRequest.addHeader("Accept", "text/*"); - servletRequest.setAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, Collections.singleton(MediaType.TEXT_HTML)); + servletRequest.setAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, + Collections.singleton(MediaType.TEXT_HTML)); given(stringMessageConverter.canWrite(String.class, MediaType.TEXT_HTML)).willReturn(true); @@ -343,7 +352,8 @@ public class RequestResponseBodyMethodProcessorMockTests { given(resourceMessageConverter.canWrite(ByteArrayResource.class, null)).willReturn(true); given(resourceMessageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.ALL)); - given(resourceMessageConverter.canWrite(ByteArrayResource.class, MediaType.APPLICATION_OCTET_STREAM)).willReturn(true); + given(resourceMessageConverter.canWrite(ByteArrayResource.class, MediaType.APPLICATION_OCTET_STREAM)) + .willReturn(true); processor.handleReturnValue(returnValue, returnTypeResource, mavContainer, webRequest); @@ -441,7 +451,9 @@ public class RequestResponseBodyMethodProcessorMockTests { private final class ValidatingBinderFactory implements WebDataBinderFactory { @Override - public WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object target, String objectName) throws Exception { + public WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object target, + String objectName) throws Exception { + LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); WebDataBinder dataBinder = new WebDataBinder(target, objectName); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java index 76287842e2a..4f67ec5a9d0 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java @@ -560,7 +560,10 @@ public class RequestResponseBodyMethodProcessorTests { @Test // SPR-12501 public void resolveArgumentWithJacksonJsonViewAndXmlMessageConverter() throws Exception { - String content = "withwithwithout"; + String content = "" + + "with" + + "with" + + "without"; this.servletRequest.setContent(content.getBytes("UTF-8")); this.servletRequest.setContentType(MediaType.APPLICATION_XML_VALUE); @@ -586,7 +589,10 @@ public class RequestResponseBodyMethodProcessorTests { @Test // SPR-12501 public void resolveHttpEntityArgumentWithJacksonJsonViewAndXmlMessageConverter() throws Exception { - String content = "withwithwithout"; + String content = "" + + "with" + + "with" + + "without"; this.servletRequest.setContent(content.getBytes("UTF-8")); this.servletRequest.setContentType(MediaType.APPLICATION_XML_VALUE); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java index 8d5cab6e5c4..53ee982bdfc 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java @@ -626,7 +626,9 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl @Test public void binderInitializingCommandProvidingFormController() throws Exception { - initServlet(wac -> wac.registerBeanDefinition("viewResolver", new RootBeanDefinition(TestViewResolver.class)), MyBinderInitializingCommandProvidingFormController.class); + initServlet(wac -> wac.registerBeanDefinition("viewResolver", + new RootBeanDefinition(TestViewResolver.class)), + MyBinderInitializingCommandProvidingFormController.class); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/myPath.do"); request.addParameter("defaultName", "myDefaultName"); @@ -639,7 +641,9 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl @Test public void specificBinderInitializingCommandProvidingFormController() throws Exception { - initServlet(wac -> wac.registerBeanDefinition("viewResolver", new RootBeanDefinition(TestViewResolver.class)), MySpecificBinderInitializingCommandProvidingFormController.class); + initServlet(wac -> wac.registerBeanDefinition("viewResolver", + new RootBeanDefinition(TestViewResolver.class)), + MySpecificBinderInitializingCommandProvidingFormController.class); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/myPath.do"); request.addParameter("defaultName", "myDefaultName"); @@ -2000,12 +2004,16 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl } @InitBinder - public void initBinder(@RequestParam("param1") String p1, @RequestParam(value="paramX", required=false) String px, int param2) { + public void initBinder(@RequestParam("param1") String p1, + @RequestParam(value="paramX", required=false) String px, int param2) { + assertNull(px); } @ModelAttribute - public void modelAttribute(@RequestParam("param1") String p1, @RequestParam(value="paramX", required=false) String px, int param2) { + public void modelAttribute(@RequestParam("param1") String p1, + @RequestParam(value="paramX", required=false) String px, int param2) { + assertNull(px); } } @@ -2036,13 +2044,17 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl @Override @InitBinder - public void initBinder(@RequestParam("param1") String p1, @RequestParam(value="paramX", required=false) String px, int param2) { + public void initBinder(@RequestParam("param1") String p1, + @RequestParam(value="paramX", required=false) String px, int param2) { + assertNull(px); } @Override @ModelAttribute - public void modelAttribute(@RequestParam("param1") String p1, @RequestParam(value="paramX", required=false) String px, int param2) { + public void modelAttribute(@RequestParam("param1") String p1, + @RequestParam(value="paramX", required=false) String px, int param2) { + assertNull(px); } } @@ -2154,7 +2166,8 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl } @Controller - public static class MyParameterizedControllerImplWithOverriddenMappings implements MyEditableParameterizedControllerIfc { + public static class MyParameterizedControllerImplWithOverriddenMappings + implements MyEditableParameterizedControllerIfc { @Override @ModelAttribute("testBeanList") @@ -2251,7 +2264,9 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl } @RequestMapping("/myPath.do") - public String myHandle(@ModelAttribute(name="myCommand", binding=true) TestBean tb, BindingResult errors, ModelMap model) { + public String myHandle(@ModelAttribute(name="myCommand", binding=true) TestBean tb, + BindingResult errors, ModelMap model) { + FieldError error = errors.getFieldError("age"); assertNotNull("Must have field error for age property", error); assertEquals("value2", error.getRejectedValue()); @@ -2266,7 +2281,9 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl static class MyCommandProvidingFormController extends MyFormController { @ModelAttribute("myCommand") - public ValidTestBean createTestBean(@RequestParam T defaultName, Map model, @RequestParam Date date) { + public ValidTestBean createTestBean(@RequestParam T defaultName, Map model, + @RequestParam Date date) { + model.put("myKey", "myOriginalValue"); ValidTestBean tb = new ValidTestBean(); tb.setName(defaultName.getClass().getSimpleName() + ":" + defaultName.toString()); @@ -3264,12 +3281,16 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl } @RequestMapping("/singleString") - public void processMultipart(@RequestParam("content") String content, HttpServletResponse response) throws IOException { + public void processMultipart(@RequestParam("content") String content, + HttpServletResponse response) throws IOException { + response.getWriter().write(content); } @RequestMapping("/stringArray") - public void processMultipart(@RequestParam("content") String[] content, HttpServletResponse response) throws IOException { + public void processMultipart(@RequestParam("content") String[] content, + HttpServletResponse response) throws IOException { + response.getWriter().write(StringUtils.arrayToDelimitedString(content, "-")); } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/UriComponentsBuilderMethodArgumentResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/UriComponentsBuilderMethodArgumentResolverTests.java index 0e6200fcc2e..09054d50f40 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/UriComponentsBuilderMethodArgumentResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/UriComponentsBuilderMethodArgumentResolverTests.java @@ -54,7 +54,8 @@ public class UriComponentsBuilderMethodArgumentResolverTests { this.servletRequest = new MockHttpServletRequest(); this.webRequest = new ServletWebRequest(this.servletRequest); - Method method = this.getClass().getDeclaredMethod("handle", UriComponentsBuilder.class, ServletUriComponentsBuilder.class, int.class); + Method method = this.getClass().getDeclaredMethod( + "handle", UriComponentsBuilder.class, ServletUriComponentsBuilder.class, int.class); this.builderParam = new MethodParameter(method, 0); this.servletBuilderParam = new MethodParameter(method, 1); this.intParam = new MethodParameter(method, 2); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java index 9b1c6eea9d7..9632a40536a 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandlerTests.java @@ -620,7 +620,8 @@ public class ResourceHttpRequestHandlerTests { private long dateHeaderAsLong(String responseHeaderName) throws Exception { - return ZonedDateTime.parse(this.response.getHeader(responseHeaderName), RFC_1123_DATE_TIME).toInstant().toEpochMilli(); + String header = this.response.getHeader(responseHeaderName); + return ZonedDateTime.parse(header, RFC_1123_DATE_TIME).toInstant().toEpochMilli(); } private long resourceLastModified(String resourceName) throws IOException { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/VersionResourceResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/VersionResourceResolverTests.java index 943e4c9496a..cb377b2e0e8 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/VersionResourceResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/VersionResourceResolverTests.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.hamcrest.Matcher; import org.hamcrest.Matchers; import org.junit.Before; import org.junit.Test; @@ -175,11 +176,12 @@ public class VersionResourceResolverTests { this.resolver.addFixedVersionStrategy("fixedversion", "/js/**", "/css/**", "/fixedversion/css/**"); + Matcher matcher = Matchers.instanceOf(FixedVersionStrategy.class); assertThat(this.resolver.getStrategyMap().size(), is(4)); - assertThat(this.resolver.getStrategyForPath("js/something.js"), Matchers.instanceOf(FixedVersionStrategy.class)); - assertThat(this.resolver.getStrategyForPath("fixedversion/js/something.js"), Matchers.instanceOf(FixedVersionStrategy.class)); - assertThat(this.resolver.getStrategyForPath("css/something.css"), Matchers.instanceOf(FixedVersionStrategy.class)); - assertThat(this.resolver.getStrategyForPath("fixedversion/css/something.css"), Matchers.instanceOf(FixedVersionStrategy.class)); + assertThat(this.resolver.getStrategyForPath("js/something.js"), matcher); + assertThat(this.resolver.getStrategyForPath("fixedversion/js/something.js"), matcher); + assertThat(this.resolver.getStrategyForPath("css/something.css"), matcher); + assertThat(this.resolver.getStrategyForPath("fixedversion/css/something.css"), matcher); } @Test // SPR-15372 diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/AnnotationConfigDispatcherServletInitializerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/AnnotationConfigDispatcherServletInitializerTests.java index e72c658c082..ca8d01bc926 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/AnnotationConfigDispatcherServletInitializerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/AnnotationConfigDispatcherServletInitializerTests.java @@ -113,8 +113,9 @@ public class AnnotationConfigDispatcherServletInitializerTests { for (MockFilterRegistration filterRegistration : filterRegistrations.values()) { assertTrue(filterRegistration.isAsyncSupported()); - assertEquals(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.ASYNC), - filterRegistration.getMappings().get(SERVLET_NAME)); + EnumSet enumSet = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, + DispatcherType.INCLUDE, DispatcherType.ASYNC); + assertEquals(enumSet, filterRegistration.getMappings().get(SERVLET_NAME)); } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/FlashMapManagerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/FlashMapManagerTests.java index 07906ab4f5f..24efd1e2f38 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/FlashMapManagerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/FlashMapManagerTests.java @@ -282,7 +282,8 @@ public class FlashMapManagerTests { this.flashMapManager.saveOutputFlashMap(flashMap, this.request, this.response); MockHttpServletRequest requestAfterRedirect = new MockHttpServletRequest("GET", "/path"); - requestAfterRedirect.setQueryString("param=%D0%90%D0%90¶m=%D0%91%D0%91¶m=%D0%92%D0%92&%3A%2F%3F%23%5B%5D%40=value"); + requestAfterRedirect.setQueryString( + "param=%D0%90%D0%90¶m=%D0%91%D0%91¶m=%D0%92%D0%92&%3A%2F%3F%23%5B%5D%40=value"); requestAfterRedirect.addParameter("param", "\u0410\u0410"); requestAfterRedirect.addParameter("param", "\u0411\u0411"); requestAfterRedirect.addParameter("param", "\u0412\u0412"); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/BindTagTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/BindTagTests.java index a47bd6b7df2..0ad26ff580c 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/BindTagTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/BindTagTests.java @@ -656,7 +656,8 @@ public class BindTagTests extends AbstractTagTests { tag.setPageContext(pc); tag.setName("tb"); assertTrue("Correct doStartTag return value", tag.doStartTag() == Tag.EVAL_BODY_INCLUDE); - assertTrue("Has errors variable", pc.getAttribute(BindErrorsTag.ERRORS_VARIABLE_NAME, PageContext.REQUEST_SCOPE) == errors); + assertTrue("Has errors variable", + pc.getAttribute(BindErrorsTag.ERRORS_VARIABLE_NAME, PageContext.REQUEST_SCOPE) == errors); } @Test diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/AbstractHtmlElementTagTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/AbstractHtmlElementTagTests.java index fa788f666c7..5eb1a09b2b7 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/AbstractHtmlElementTagTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/AbstractHtmlElementTagTests.java @@ -29,6 +29,7 @@ import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.mock.web.test.MockPageContext; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; +import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.StaticWebApplicationContext; import org.springframework.web.servlet.support.JspAwareRequestContext; import org.springframework.web.servlet.support.RequestContext; @@ -68,8 +69,8 @@ public abstract class AbstractHtmlElementTagTests extends AbstractTagTests { protected MockPageContext createAndPopulatePageContext() throws JspException { MockPageContext pageContext = createPageContext(); MockHttpServletRequest request = (MockHttpServletRequest) pageContext.getRequest(); - StaticWebApplicationContext wac = (StaticWebApplicationContext) RequestContextUtils.findWebApplicationContext(request); - wac.registerSingleton("requestDataValueProcessor", RequestDataValueProcessorWrapper.class); + ((StaticWebApplicationContext) RequestContextUtils.findWebApplicationContext(request)) + .registerSingleton("requestDataValueProcessor", RequestDataValueProcessorWrapper.class); extendRequest(request); extendPageContext(pageContext); RequestContext requestContext = new JspAwareRequestContext(pageContext); @@ -106,7 +107,7 @@ public abstract class AbstractHtmlElementTagTests extends AbstractTagTests { protected RequestDataValueProcessor getMockRequestDataValueProcessor() { RequestDataValueProcessor mockProcessor = mock(RequestDataValueProcessor.class); HttpServletRequest request = (HttpServletRequest) getPageContext().getRequest(); - StaticWebApplicationContext wac = (StaticWebApplicationContext) RequestContextUtils.findWebApplicationContext(request); + WebApplicationContext wac = RequestContextUtils.findWebApplicationContext(request); wac.getBean(RequestDataValueProcessorWrapper.class).setRequestDataValueProcessor(mockProcessor); return mockProcessor; } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java index 46c353143c1..1af0e0ef6c9 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/FormTagTests.java @@ -233,8 +233,8 @@ public class FormTagTests extends AbstractHtmlElementTagTests { String xssQueryString = QUERY_STRING + "&stuff=\">"; request.setQueryString(xssQueryString); tag.doStartTag(); - assertEquals("
    ", - getOutput()); + assertEquals("", getOutput()); } @Test diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/OptionTagEnumTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/OptionTagEnumTests.java index 87c3fee0151..d5f04500a2a 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/OptionTagEnumTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/OptionTagEnumTests.java @@ -63,7 +63,8 @@ public class OptionTagEnumTests extends AbstractHtmlElementTagTests { testBean.setCustomEnum(CustomEnum.VALUE_1); getPageContext().getRequest().setAttribute("testBean", testBean); String selectName = "testBean.customEnum"; - getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, new BindStatus(getRequestContext(), selectName, false)); + getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, + new BindStatus(getRequestContext(), selectName, false)); this.tag.setValue("VALUE_1"); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/OptionTagTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/OptionTagTests.java index d68d8cf79f0..632998184e3 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/OptionTagTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/OptionTagTests.java @@ -79,7 +79,8 @@ public class OptionTagTests extends AbstractHtmlElementTagTests { @Test public void canBeDisabledEvenWhenSelected() throws Exception { String selectName = "testBean.name"; - getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, new BindStatus(getRequestContext(), selectName, false)); + BindStatus bindStatus = new BindStatus(getRequestContext(), selectName, false); + getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, bindStatus); this.tag.setValue("bar"); this.tag.setLabel("Bar"); this.tag.setDisabled(true); @@ -100,7 +101,8 @@ public class OptionTagTests extends AbstractHtmlElementTagTests { @Test public void renderNotSelected() throws Exception { String selectName = "testBean.name"; - getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, new BindStatus(getRequestContext(), selectName, false)); + BindStatus bindStatus = new BindStatus(getRequestContext(), selectName, false); + getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, bindStatus); this.tag.setValue("bar"); this.tag.setLabel("Bar"); int result = this.tag.doStartTag(); @@ -122,7 +124,8 @@ public class OptionTagTests extends AbstractHtmlElementTagTests { String dynamicAttribute2 = "attr2"; String selectName = "testBean.name"; - getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, new BindStatus(getRequestContext(), selectName, false)); + BindStatus bindStatus = new BindStatus(getRequestContext(), selectName, false); + getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, bindStatus); this.tag.setValue("bar"); this.tag.setLabel("Bar"); this.tag.setDynamicAttribute(null, dynamicAttribute1, dynamicAttribute1); @@ -146,7 +149,8 @@ public class OptionTagTests extends AbstractHtmlElementTagTests { @Test public void renderSelected() throws Exception { String selectName = "testBean.name"; - getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, new BindStatus(getRequestContext(), selectName, false)); + BindStatus bindStatus = new BindStatus(getRequestContext(), selectName, false); + getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, bindStatus); this.tag.setId("myOption"); this.tag.setValue("foo"); this.tag.setLabel("Foo"); @@ -168,7 +172,8 @@ public class OptionTagTests extends AbstractHtmlElementTagTests { @Test public void withNoLabel() throws Exception { String selectName = "testBean.name"; - getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, new BindStatus(getRequestContext(), selectName, false)); + BindStatus bindStatus = new BindStatus(getRequestContext(), selectName, false); + getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, bindStatus); this.tag.setValue("bar"); this.tag.setCssClass("myClass"); this.tag.setOnclick("CLICK"); @@ -261,7 +266,8 @@ public class OptionTagTests extends AbstractHtmlElementTagTests { @Test public void withCustomObjectSelected() throws Exception { String selectName = "testBean.someNumber"; - getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, new BindStatus(getRequestContext(), selectName, false)); + BindStatus bindStatus = new BindStatus(getRequestContext(), selectName, false); + getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, bindStatus); this.tag.setValue(new Float(12.34)); this.tag.setLabel("GBP 12.34"); int result = this.tag.doStartTag(); @@ -281,7 +287,8 @@ public class OptionTagTests extends AbstractHtmlElementTagTests { @Test public void withCustomObjectNotSelected() throws Exception { String selectName = "testBean.someNumber"; - getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, new BindStatus(getRequestContext(), selectName, false)); + BindStatus bindStatus = new BindStatus(getRequestContext(), selectName, false); + getPageContext().setAttribute(SelectTag.LIST_VALUE_PAGE_ATTRIBUTE, bindStatus); this.tag.setValue(new Float(12.35)); this.tag.setLabel("GBP 12.35"); int result = this.tag.doStartTag(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/RadioButtonsTagTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/RadioButtonsTagTests.java index 927c4a27f7d..8be97ff78fa 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/RadioButtonsTagTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/RadioButtonsTagTests.java @@ -495,8 +495,10 @@ public class RadioButtonsTagTests extends AbstractFormTagTests { assertEquals(2, rootElement.elements().size()); Node value1 = rootElement.selectSingleNode("//input[@value = 'VALUE_1']"); Node value2 = rootElement.selectSingleNode("//input[@value = 'VALUE_2']"); - assertEquals("TestEnum: VALUE_1", rootElement.selectSingleNode("//label[@for = '" + value1.valueOf("@id") + "']").getText()); - assertEquals("TestEnum: VALUE_2", rootElement.selectSingleNode("//label[@for = '" + value2.valueOf("@id") + "']").getText()); + assertEquals("TestEnum: VALUE_1", + rootElement.selectSingleNode("//label[@for = '" + value1.valueOf("@id") + "']").getText()); + assertEquals("TestEnum: VALUE_2", + rootElement.selectSingleNode("//label[@for = '" + value2.valueOf("@id") + "']").getText()); assertEquals(value2, rootElement.selectSingleNode("//input[@checked]")); } @@ -520,8 +522,10 @@ public class RadioButtonsTagTests extends AbstractFormTagTests { assertEquals(2, rootElement.elements().size()); Node value1 = rootElement.selectSingleNode("//input[@value = 'Value: VALUE_1']"); Node value2 = rootElement.selectSingleNode("//input[@value = 'Value: VALUE_2']"); - assertEquals("Label: VALUE_1", rootElement.selectSingleNode("//label[@for = '" + value1.valueOf("@id") + "']").getText()); - assertEquals("Label: VALUE_2", rootElement.selectSingleNode("//label[@for = '" + value2.valueOf("@id") + "']").getText()); + assertEquals("Label: VALUE_1", + rootElement.selectSingleNode("//label[@for = '" + value1.valueOf("@id") + "']").getText()); + assertEquals("Label: VALUE_2", + rootElement.selectSingleNode("//label[@for = '" + value2.valueOf("@id") + "']").getText()); assertEquals(value2, rootElement.selectSingleNode("//input[@checked]")); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/TagWriterTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/TagWriterTests.java index 31f314b09ea..cca56888a82 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/TagWriterTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/TagWriterTests.java @@ -99,7 +99,8 @@ public class TagWriterTests { } this.writer.endTag(); - assertEquals("Rob Harrop", this.data.toString()); + assertEquals("Rob Harrop", + this.data.toString()); } @Test diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/BaseViewTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/BaseViewTests.java index f95c91b8db2..ad10f2d3d10 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/BaseViewTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/BaseViewTests.java @@ -293,7 +293,9 @@ public class BaseViewTests { private static class ConcreteView extends AbstractView { // Do-nothing concrete subclass @Override - protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) + protected void renderMergedOutputModel(Map model, + HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { throw new UnsupportedOperationException(); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/feed/RssFeedViewTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/feed/RssFeedViewTests.java index ee9d2a7fe9f..414cf79953e 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/feed/RssFeedViewTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/feed/RssFeedViewTests.java @@ -56,9 +56,12 @@ public class RssFeedViewTests { view.render(model, request, response); assertEquals("Invalid content-type", "application/rss+xml", response.getContentType()); String expected = "" + - "Test Feedhttp://example.comTest feed description" + + "Test Feed" + + "http://example.com" + + "Test feed description" + "2This is entry 2" + - "1This is entry 1" + ""; + "1This is entry 1" + + ""; assertThat(response.getContentAsString(), isSimilarTo(expected).ignoreWhitespace()); } @@ -73,7 +76,9 @@ public class RssFeedViewTests { } @Override - protected List buildFeedItems(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { + protected List buildFeedItems(Map model, + HttpServletRequest request, HttpServletResponse response) throws Exception { + List items = new ArrayList<>(); for (String name : model.keySet()) { Item item = new Item(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java index 6131af4ccb2..99085be46ab 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java @@ -260,20 +260,26 @@ public class FreeMarkerMacroTests { @Test public void testForm16() throws Exception { String output = getMacroOutput("FORM16"); - assertTrue("Wrong output: " + output, output.startsWith("")); - assertTrue("Wrong output: " + output, output.contains("")); + assertTrue("Wrong output: " + output, output.startsWith( + "")); + assertTrue("Wrong output: " + output, output.contains( + "")); } @Test public void testForm17() throws Exception { - assertEquals("", getMacroOutput("FORM17")); + assertEquals( + "", + getMacroOutput("FORM17")); } @Test public void testForm18() throws Exception { String output = getMacroOutput("FORM18"); - assertTrue("Wrong output: " + output, output.startsWith("")); - assertTrue("Wrong output: " + output, output.contains("")); + assertTrue("Wrong output: " + output, output.startsWith( + "")); + assertTrue("Wrong output: " + output, output.contains( + "")); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/groovy/GroovyMarkupViewTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/groovy/GroovyMarkupViewTests.java index 6d3c3310529..dc6d0d5f534 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/groovy/GroovyMarkupViewTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/groovy/GroovyMarkupViewTests.java @@ -158,7 +158,9 @@ public class GroovyMarkupViewTests { } - private MockHttpServletResponse renderViewWithModel(String viewUrl, Map model, Locale locale) throws Exception { + private MockHttpServletResponse renderViewWithModel(String viewUrl, Map model, Locale locale) throws Exception { + GroovyMarkupView view = createViewWithUrl(viewUrl); MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletRequest request = new MockHttpServletRequest(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/JRubyScriptTemplateTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/JRubyScriptTemplateTests.java index 72fc7f542e2..2109243c66e 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/JRubyScriptTemplateTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/JRubyScriptTemplateTests.java @@ -60,12 +60,13 @@ public class JRubyScriptTemplateTests { Map model = new HashMap<>(); model.put("title", "Layout example"); model.put("body", "This is the body"); - MockHttpServletResponse response = renderViewWithModel("org/springframework/web/servlet/view/script/jruby/template.erb", model); + String url = "org/springframework/web/servlet/view/script/jruby/template.erb"; + MockHttpServletResponse response = render(url, model); assertEquals("Layout example

    This is the body

    ", response.getContentAsString()); } - private MockHttpServletResponse renderViewWithModel(String viewUrl, Map model) throws Exception { + private MockHttpServletResponse render(String viewUrl, Map model) throws Exception { ScriptTemplateView view = createViewWithUrl(viewUrl); MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletRequest request = new MockHttpServletRequest(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/JythonScriptTemplateTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/JythonScriptTemplateTests.java index 4c090cf9bf4..9be40360ed1 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/JythonScriptTemplateTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/JythonScriptTemplateTests.java @@ -57,12 +57,13 @@ public class JythonScriptTemplateTests { Map model = new HashMap<>(); model.put("title", "Layout example"); model.put("body", "This is the body"); - MockHttpServletResponse response = renderViewWithModel("org/springframework/web/servlet/view/script/jython/template.html", model); + String url = "org/springframework/web/servlet/view/script/jython/template.html"; + MockHttpServletResponse response = render(url, model); assertEquals("Layout example

    This is the body

    ", response.getContentAsString()); } - private MockHttpServletResponse renderViewWithModel(String viewUrl, Map model) throws Exception { + private MockHttpServletResponse render(String viewUrl, Map model) throws Exception { ScriptTemplateView view = createViewWithUrl(viewUrl); MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletRequest request = new MockHttpServletRequest(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java index 59900db5b54..ad811b3e841 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java @@ -62,20 +62,18 @@ public class KotlinScriptTemplateTests { public void renderTemplateWithFrenchLocale() throws Exception { Map model = new HashMap<>(); model.put("foo", "Foo"); - MockHttpServletResponse response = renderViewWithModel("org/springframework/web/servlet/view/script/kotlin/template.kts", - model, Locale.FRENCH, ScriptTemplatingConfiguration.class); - assertEquals("\n

    Bonjour Foo

    \n", - response.getContentAsString()); + String url = "org/springframework/web/servlet/view/script/kotlin/template.kts"; + MockHttpServletResponse response = render(url, model, Locale.FRENCH, ScriptTemplatingConfiguration.class); + assertEquals("\n

    Bonjour Foo

    \n", response.getContentAsString()); } @Test public void renderTemplateWithEnglishLocale() throws Exception { Map model = new HashMap<>(); model.put("foo", "Foo"); - MockHttpServletResponse response = renderViewWithModel("org/springframework/web/servlet/view/script/kotlin/template.kts", - model, Locale.ENGLISH, ScriptTemplatingConfiguration.class); - assertEquals("\n

    Hello Foo

    \n", - response.getContentAsString()); + String url = "org/springframework/web/servlet/view/script/kotlin/template.kts"; + MockHttpServletResponse response = render(url, model, Locale.ENGLISH, ScriptTemplatingConfiguration.class); + assertEquals("\n

    Hello Foo

    \n", response.getContentAsString()); } @Test @@ -85,14 +83,16 @@ public class KotlinScriptTemplateTests { model.put("hello", "Hello"); model.put("foo", "Foo"); model.put("footer", ""); - MockHttpServletResponse response = renderViewWithModel("org/springframework/web/servlet/view/script/kotlin/eval.kts", + MockHttpServletResponse response = render("org/springframework/web/servlet/view/script/kotlin/eval.kts", model, Locale.ENGLISH, ScriptTemplatingConfigurationWithoutRenderFunction.class); assertEquals("\n

    Hello Foo

    \n", response.getContentAsString()); } - private MockHttpServletResponse renderViewWithModel(String viewUrl, Map model, Locale locale, Class configuration) throws Exception { + private MockHttpServletResponse render(String viewUrl, Map model, + Locale locale, Class configuration) throws Exception { + ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletRequest request = new MockHttpServletRequest(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java index fdb86978eea..d03123277ae 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/NashornScriptTemplateTests.java @@ -57,21 +57,23 @@ public class NashornScriptTemplateTests { Map model = new HashMap<>(); model.put("title", "Layout example"); model.put("body", "This is the body"); - MockHttpServletResponse response = renderViewWithModel("org/springframework/web/servlet/view/script/nashorn/template.html", - model, ScriptTemplatingConfiguration.class); + String url = "org/springframework/web/servlet/view/script/nashorn/template.html"; + MockHttpServletResponse response = render(url, model, ScriptTemplatingConfiguration.class); assertEquals("Layout example

    This is the body

    ", response.getContentAsString()); } @Test // SPR-13453 public void renderTemplateWithUrl() throws Exception { - MockHttpServletResponse response = renderViewWithModel("org/springframework/web/servlet/view/script/nashorn/template.html", - null, ScriptTemplatingWithUrlConfiguration.class); - assertEquals("Check url parameter

    org/springframework/web/servlet/view/script/nashorn/template.html

    ", + String url = "org/springframework/web/servlet/view/script/nashorn/template.html"; + MockHttpServletResponse response = render(url, null, ScriptTemplatingWithUrlConfiguration.class); + assertEquals("Check url parameter

    " + url + "

    ", response.getContentAsString()); } - private MockHttpServletResponse renderViewWithModel(String viewUrl, Map model, Class configuration) throws Exception { + private MockHttpServletResponse render(String viewUrl, Map model, + Class configuration) throws Exception { + ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletRequest request = new MockHttpServletRequest(); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java index 05a67eb81a9..61141644a3a 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/HandlersBeanDefinitionParser.java @@ -58,10 +58,10 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { @Override @Nullable - public BeanDefinition parse(Element element, ParserContext context) { - Object source = context.extractSource(element); + public BeanDefinition parse(Element element, ParserContext cxt) { + Object source = cxt.extractSource(element); CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); - context.pushContainingComponent(compDefinition); + cxt.pushContainingComponent(compDefinition); String orderAttribute = element.getAttribute("order"); int order = orderAttribute.isEmpty() ? DEFAULT_MAPPING_ORDER : Integer.valueOf(orderAttribute); @@ -70,34 +70,34 @@ class HandlersBeanDefinitionParser implements BeanDefinitionParser { handlerMappingDef.setSource(source); handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); handlerMappingDef.getPropertyValues().add("order", order); - String handlerMappingName = context.getReaderContext().registerWithGeneratedName(handlerMappingDef); + String handlerMappingName = cxt.getReaderContext().registerWithGeneratedName(handlerMappingDef); RuntimeBeanReference sockJsService = WebSocketNamespaceUtils.registerSockJsService( - element, SOCK_JS_SCHEDULER_NAME, context, source); + element, SOCK_JS_SCHEDULER_NAME, cxt, source); HandlerMappingStrategy strategy; if (sockJsService != null) { strategy = new SockJsHandlerMappingStrategy(sockJsService); } else { - RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source); - Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context); - String allowedOriginsAttribute = element.getAttribute("allowed-origins"); - List allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ",")); - interceptors.add(new OriginHandshakeInterceptor(allowedOrigins)); - strategy = new WebSocketHandlerMappingStrategy(handshakeHandler, interceptors); + RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, cxt, source); + Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, cxt); + String allowedOrigins = element.getAttribute("allowed-origins"); + List origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); + interceptors.add(new OriginHandshakeInterceptor(origins)); + strategy = new WebSocketHandlerMappingStrategy(handler, interceptors); } ManagedMap urlMap = new ManagedMap<>(); urlMap.setSource(source); for (Element mappingElement : DomUtils.getChildElementsByTagName(element, "mapping")) { - strategy.addMapping(mappingElement, urlMap, context); + strategy.addMapping(mappingElement, urlMap, cxt); } handlerMappingDef.getPropertyValues().add("urlMap", urlMap); - context.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingName)); - context.popAndRegisterContainingComponent(); + cxt.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingName)); + cxt.popAndRegisterContainingComponent(); return null; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java index 0491917bae3..684a01727e8 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java @@ -321,12 +321,12 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { } private RuntimeBeanReference registerRequestHandler(Element element, RuntimeBeanReference subProtoHandler, - ParserContext context, @Nullable Object source) { + ParserContext cxt, @Nullable Object source) { RootBeanDefinition beanDef; RuntimeBeanReference sockJsService = WebSocketNamespaceUtils.registerSockJsService( - element, SCHEDULER_BEAN_NAME, context, source); + element, SCHEDULER_BEAN_NAME, cxt, source); if (sockJsService != null) { ConstructorArgumentValues cavs = new ConstructorArgumentValues(); @@ -335,22 +335,22 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { beanDef = new RootBeanDefinition(SockJsHttpRequestHandler.class, cavs, null); // Register alias for backwards compatibility with 4.1 - context.getRegistry().registerAlias(SCHEDULER_BEAN_NAME, SOCKJS_SCHEDULER_BEAN_NAME); + cxt.getRegistry().registerAlias(SCHEDULER_BEAN_NAME, SOCKJS_SCHEDULER_BEAN_NAME); } else { - RuntimeBeanReference handshakeHandler = WebSocketNamespaceUtils.registerHandshakeHandler(element, context, source); - Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context); - String allowedOriginsAttribute = element.getAttribute("allowed-origins"); - List allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ",")); - interceptors.add(new OriginHandshakeInterceptor(allowedOrigins)); + RuntimeBeanReference handler = WebSocketNamespaceUtils.registerHandshakeHandler(element, cxt, source); + Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, cxt); + String allowedOrigins = element.getAttribute("allowed-origins"); + List origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); + interceptors.add(new OriginHandshakeInterceptor(origins)); ConstructorArgumentValues cavs = new ConstructorArgumentValues(); cavs.addIndexedArgumentValue(0, subProtoHandler); - cavs.addIndexedArgumentValue(1, handshakeHandler); + cavs.addIndexedArgumentValue(1, handler); beanDef = new RootBeanDefinition(WebSocketHttpRequestHandler.class, cavs, null); beanDef.getPropertyValues().add("handshakeInterceptors", interceptors); } - return new RuntimeBeanReference(registerBeanDef(beanDef, context, source)); + return new RuntimeBeanReference(registerBeanDef(beanDef, cxt, source)); } private RootBeanDefinition registerMessageBroker(Element brokerElement, diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java index 54dce56fbfe..cdf3683cae5 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java @@ -66,7 +66,7 @@ class WebSocketNamespaceUtils { @Nullable public static RuntimeBeanReference registerSockJsService(Element element, String schedulerName, - ParserContext context, @Nullable Object source) { + ParserContext cxt, @Nullable Object source) { Element sockJsElement = DomUtils.getChildElementByTagName(element, "sockjs"); @@ -82,7 +82,7 @@ class WebSocketNamespaceUtils { scheduler = new RuntimeBeanReference(customTaskSchedulerName); } else { - scheduler = registerScheduler(schedulerName, context, source); + scheduler = registerScheduler(schedulerName, cxt, source); } sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(0, scheduler); @@ -92,7 +92,7 @@ class WebSocketNamespaceUtils { if (registerDefaults.equals("false")) { sockJsServiceDef.setBeanClass(TransportHandlingSockJsService.class); } - ManagedList transportHandlers = parseBeanSubElements(transportHandlersElement, context); + ManagedList transportHandlers = parseBeanSubElements(transportHandlersElement, cxt); sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandlers); } else if (handshakeHandler != null) { @@ -103,13 +103,13 @@ class WebSocketNamespaceUtils { sockJsServiceDef.getConstructorArgumentValues().addIndexedArgumentValue(1, transportHandler); } - Element interceptorsElement = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); - ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptorsElement, context); - String allowedOriginsAttribute = element.getAttribute("allowed-origins"); - List allowedOrigins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOriginsAttribute, ",")); - sockJsServiceDef.getPropertyValues().add("allowedOrigins", allowedOrigins); + Element interceptElem = DomUtils.getChildElementByTagName(element, "handshake-interceptors"); + ManagedList interceptors = WebSocketNamespaceUtils.parseBeanSubElements(interceptElem, cxt); + String allowedOrigins = element.getAttribute("allowed-origins"); + List origins = Arrays.asList(StringUtils.tokenizeToStringArray(allowedOrigins, ",")); + sockJsServiceDef.getPropertyValues().add("allowedOrigins", origins); RootBeanDefinition originHandshakeInterceptor = new RootBeanDefinition(OriginHandshakeInterceptor.class); - originHandshakeInterceptor.getPropertyValues().add("allowedOrigins", allowedOrigins); + originHandshakeInterceptor.getPropertyValues().add("allowedOrigins", origins); interceptors.add(originHandshakeInterceptor); sockJsServiceDef.getPropertyValues().add("handshakeInterceptors", interceptors); @@ -154,7 +154,7 @@ class WebSocketNamespaceUtils { sockJsServiceDef.getPropertyValues().add("suppressCors", Boolean.valueOf(attrValue)); } sockJsServiceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - String sockJsServiceName = context.getReaderContext().registerWithGeneratedName(sockJsServiceDef); + String sockJsServiceName = cxt.getReaderContext().registerWithGeneratedName(sockJsServiceDef); return new RuntimeBeanReference(sockJsServiceName); } return null; @@ -176,7 +176,9 @@ class WebSocketNamespaceUtils { return new RuntimeBeanReference(schedulerName); } - public static ManagedList parseBeanSubElements(@Nullable Element parentElement, ParserContext context) { + public static ManagedList parseBeanSubElements(@Nullable Element parentElement, + ParserContext context) { + ManagedList beans = new ManagedList<>(); if (parentElement != null) { beans.setSource(context.extractSource(parentElement)); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/JettyXhrTransport.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/JettyXhrTransport.java index a3b6edbb5da..a6e9046e2c5 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/JettyXhrTransport.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/JettyXhrTransport.java @@ -137,7 +137,9 @@ public class JettyXhrTransport extends AbstractXhrTransport implements Lifecycle return executeRequest(url, HttpMethod.POST, headers, message.getPayload()); } - protected ResponseEntity executeRequest(URI url, HttpMethod method, HttpHeaders headers, @Nullable String body) { + protected ResponseEntity executeRequest(URI url, HttpMethod method, + HttpHeaders headers, @Nullable String body) { + Request httpRequest = this.httpClient.newRequest(url).method(method); addHttpHeaders(httpRequest, headers); if (body != null) { diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/ContextLoaderTestUtils.java b/spring-websocket/src/test/java/org/springframework/web/socket/ContextLoaderTestUtils.java index 8853d824946..ee21eb45798 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/ContextLoaderTestUtils.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/ContextLoaderTestUtils.java @@ -29,13 +29,16 @@ import org.springframework.web.context.WebApplicationContext; */ public class ContextLoaderTestUtils { - private static Map currentContextPerThread = getCurrentContextPerThreadFromContextLoader(); + private static Map currentContextPerThread = + getCurrentContextPerThreadFromContextLoader(); public static void setCurrentWebApplicationContext(WebApplicationContext applicationContext) { setCurrentWebApplicationContext(Thread.currentThread().getContextClassLoader(), applicationContext); } - public static void setCurrentWebApplicationContext(ClassLoader classLoader, WebApplicationContext applicationContext) { + public static void setCurrentWebApplicationContext(ClassLoader classLoader, + WebApplicationContext applicationContext) { + if (applicationContext != null) { currentContextPerThread.put(classLoader, applicationContext); } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/UndertowTestServer.java b/spring-websocket/src/test/java/org/springframework/web/socket/UndertowTestServer.java index 888d359136a..a4765a1de41 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/UndertowTestServer.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/UndertowTestServer.java @@ -31,6 +31,7 @@ import io.undertow.servlet.api.DeploymentManager; import io.undertow.servlet.api.FilterInfo; import io.undertow.servlet.api.InstanceFactory; import io.undertow.servlet.api.InstanceHandle; +import io.undertow.servlet.api.ServletInfo; import io.undertow.websockets.jsr.WebSocketDeploymentInfo; import org.xnio.OptionMap; import org.xnio.Xnio; @@ -76,11 +77,13 @@ public class UndertowTestServer implements WebSocketTestServer { throw new IllegalStateException(ex); } + ServletInfo servletInfo = servlet("DispatcherServlet", DispatcherServlet.class, servletFactory) + .addMapping("/").setAsyncSupported(true); DeploymentInfo servletBuilder = deployment() .setClassLoader(UndertowTestServer.class.getClassLoader()) .setDeploymentName("undertow-websocket-test") .setContextPath("/") - .addServlet(servlet("DispatcherServlet", DispatcherServlet.class, servletFactory).addMapping("/").setAsyncSupported(true)) + .addServlet(servletInfo) .addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, info); for (final Filter filter : filters) { String filterName = filter.getClass().getName(); diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java index 04326a02164..cc4c3ac97a3 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/client/WebSocketConnectionManagerTests.java @@ -112,13 +112,17 @@ public class WebSocketConnectionManagerTests { } @Override - public ListenableFuture doHandshake(WebSocketHandler handler, String uriTemplate, Object... uriVars) { + public ListenableFuture doHandshake(WebSocketHandler handler, + String uriTemplate, Object... uriVars) { + URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVars).encode().toUri(); return doHandshake(handler, null, uri); } @Override - public ListenableFuture doHandshake(WebSocketHandler handler, WebSocketHttpHeaders headers, URI uri) { + public ListenableFuture doHandshake(WebSocketHandler handler, + WebSocketHttpHeaders headers, URI uri) { + this.webSocketHandler = handler; this.headers = headers; this.uri = uri; diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/config/HandlersBeanDefinitionParserTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/config/HandlersBeanDefinitionParserTests.java index a90c30dde0e..f7ee1374317 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/config/HandlersBeanDefinitionParserTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/config/HandlersBeanDefinitionParserTests.java @@ -173,8 +173,8 @@ public class HandlersBeanDefinitionParserTests { assertThat(defaultSockJsService.getTaskScheduler(), instanceOf(ThreadPoolTaskScheduler.class)); assertFalse(defaultSockJsService.shouldSuppressCors()); - Map transportHandlers = defaultSockJsService.getTransportHandlers(); - assertThat(transportHandlers.values(), + Map handlerMap = defaultSockJsService.getTransportHandlers(); + assertThat(handlerMap.values(), containsInAnyOrder( instanceOf(XhrPollingTransportHandler.class), instanceOf(XhrReceivingTransportHandler.class), @@ -185,11 +185,12 @@ public class HandlersBeanDefinitionParserTests { instanceOf(HtmlFileTransportHandler.class), instanceOf(WebSocketTransportHandler.class))); - WebSocketTransportHandler handler = (WebSocketTransportHandler) transportHandlers.get(TransportType.WEBSOCKET); + WebSocketTransportHandler handler = (WebSocketTransportHandler) handlerMap.get(TransportType.WEBSOCKET); assertEquals(TestHandshakeHandler.class, handler.getHandshakeHandler().getClass()); List interceptors = defaultSockJsService.getHandshakeInterceptors(); - assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), instanceOf(BarTestInterceptor.class), instanceOf(OriginHandshakeInterceptor.class))); + assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), + instanceOf(BarTestInterceptor.class), instanceOf(OriginHandshakeInterceptor.class))); } @Test diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java index c8c8f79189b..7b326503715 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.ScheduledThreadPoolExecutor; import org.hamcrest.Matchers; import org.junit.Test; @@ -174,8 +175,9 @@ public class MessageBrokerBeanDefinitionParserTests { assertFalse(defaultSockJsService.shouldSuppressCors()); ThreadPoolTaskScheduler scheduler = (ThreadPoolTaskScheduler) defaultSockJsService.getTaskScheduler(); - assertEquals(Runtime.getRuntime().availableProcessors(), scheduler.getScheduledThreadPoolExecutor().getCorePoolSize()); - assertTrue(scheduler.getScheduledThreadPoolExecutor().getRemoveOnCancelPolicy()); + ScheduledThreadPoolExecutor executor = scheduler.getScheduledThreadPoolExecutor(); + assertEquals(Runtime.getRuntime().availableProcessors(), executor.getCorePoolSize()); + assertTrue(executor.getRemoveOnCancelPolicy()); interceptors = defaultSockJsService.getHandshakeInterceptors(); assertThat(interceptors, contains(instanceOf(FooTestInterceptor.class), @@ -226,8 +228,9 @@ public class MessageBrokerBeanDefinitionParserTests { assertNotNull(this.appContext.getBean("webSocketScopeConfigurer", CustomScopeConfigurer.class)); - DirectFieldAccessor subscriptionRegistryAccessor = new DirectFieldAccessor(brokerMessageHandler.getSubscriptionRegistry()); - String pathSeparator = (String) new DirectFieldAccessor(subscriptionRegistryAccessor.getPropertyValue("pathMatcher")).getPropertyValue("pathSeparator"); + DirectFieldAccessor accessor = new DirectFieldAccessor(brokerMessageHandler.getSubscriptionRegistry()); + Object pathMatcher = accessor.getPropertyValue("pathMatcher"); + String pathSeparator = (String) new DirectFieldAccessor(pathMatcher).getPropertyValue("pathSeparator"); assertEquals(".", pathSeparator); } @@ -314,10 +317,14 @@ public class MessageBrokerBeanDefinitionParserTests { String expected = "WebSocketSession\\[0 current WS\\(0\\)-HttpStream\\(0\\)-HttpPoll\\(0\\), " + "0 total, 0 closed abnormally \\(0 connect failure, 0 send limit, 0 transport error\\)\\], " + "stompSubProtocol\\[processed CONNECT\\(0\\)-CONNECTED\\(0\\)-DISCONNECT\\(0\\)\\], " + - "stompBrokerRelay\\[0 sessions, relayhost:1234 \\(not available\\), processed CONNECT\\(0\\)-CONNECTED\\(0\\)-DISCONNECT\\(0\\)\\], " + - "inboundChannel\\[pool size = \\d, active threads = \\d, queued tasks = \\d, completed tasks = \\d\\], " + - "outboundChannelpool size = \\d, active threads = \\d, queued tasks = \\d, completed tasks = \\d\\], " + - "sockJsScheduler\\[pool size = \\d, active threads = \\d, queued tasks = \\d, completed tasks = \\d\\]"; + "stompBrokerRelay\\[0 sessions, relayhost:1234 \\(not available\\), " + + "processed CONNECT\\(0\\)-CONNECTED\\(0\\)-DISCONNECT\\(0\\)\\], " + + "inboundChannel\\[pool size = \\d, active threads = \\d, queued tasks = \\d, " + + "completed tasks = \\d\\], " + + "outboundChannelpool size = \\d, active threads = \\d, queued tasks = \\d, " + + "completed tasks = \\d\\], " + + "sockJsScheduler\\[pool size = \\d, active threads = \\d, queued tasks = \\d, " + + "completed tasks = \\d\\]"; assertTrue("\nExpected: " + expected.replace("\\", "") + "\n Actual: " + actual, actual.matches(expected)); } @@ -353,7 +360,8 @@ public class MessageBrokerBeanDefinitionParserTests { assertEquals(MimeTypeUtils.APPLICATION_JSON, ((DefaultContentTypeResolver) resolver).getDefaultMimeType()); DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(annotationMethodMessageHandler); - String pathSeparator = (String) new DirectFieldAccessor(handlerAccessor.getPropertyValue("pathMatcher")).getPropertyValue("pathSeparator"); + Object pathMatcher = handlerAccessor.getPropertyValue("pathMatcher"); + String pathSeparator = (String) new DirectFieldAccessor(pathMatcher).getPropertyValue("pathSeparator"); assertEquals(".", pathSeparator); } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebMvcStompWebSocketEndpointRegistrationTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebMvcStompWebSocketEndpointRegistrationTests.java index 435e5158508..961999b303a 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebMvcStompWebSocketEndpointRegistrationTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/config/annotation/WebMvcStompWebSocketEndpointRegistrationTests.java @@ -84,24 +84,27 @@ public class WebMvcStompWebSocketEndpointRegistrationTests { MultiValueMap mappings = registration.getMappings(); assertEquals(1, mappings.size()); - WebSocketHttpRequestHandler requestHandler = (WebSocketHttpRequestHandler)mappings.entrySet().iterator().next().getKey(); - assertNotNull(requestHandler.getWebSocketHandler()); - assertEquals(1, requestHandler.getHandshakeInterceptors().size()); - assertEquals(OriginHandshakeInterceptor.class, requestHandler.getHandshakeInterceptors().get(0).getClass()); + HttpRequestHandler handler = mappings.entrySet().iterator().next().getKey(); + WebSocketHttpRequestHandler wsHandler = (WebSocketHttpRequestHandler) handler; + assertNotNull(wsHandler.getWebSocketHandler()); + assertEquals(1, wsHandler.getHandshakeInterceptors().size()); + assertEquals(OriginHandshakeInterceptor.class, wsHandler.getHandshakeInterceptors().get(0).getClass()); } @Test public void sameOrigin() { - WebMvcStompWebSocketEndpointRegistration registration = new WebMvcStompWebSocketEndpointRegistration(new String[] {"/foo"}, this.handler, this.scheduler); + WebMvcStompWebSocketEndpointRegistration registration = new WebMvcStompWebSocketEndpointRegistration( + new String[] {"/foo"}, this.handler, this.scheduler); registration.setAllowedOrigins(); MultiValueMap mappings = registration.getMappings(); assertEquals(1, mappings.size()); - WebSocketHttpRequestHandler requestHandler = (WebSocketHttpRequestHandler)mappings.entrySet().iterator().next().getKey(); - assertNotNull(requestHandler.getWebSocketHandler()); - assertEquals(1, requestHandler.getHandshakeInterceptors().size()); - assertEquals(OriginHandshakeInterceptor.class, requestHandler.getHandshakeInterceptors().get(0).getClass()); + HttpRequestHandler handler = mappings.entrySet().iterator().next().getKey(); + WebSocketHttpRequestHandler wsHandler = (WebSocketHttpRequestHandler) handler; + assertNotNull(wsHandler.getWebSocketHandler()); + assertEquals(1, wsHandler.getHandshakeInterceptors().size()); + assertEquals(OriginHandshakeInterceptor.class, wsHandler.getHandshakeInterceptors().get(0).getClass()); } @Test @@ -234,7 +237,8 @@ public class WebMvcStompWebSocketEndpointRegistrationTests { HttpSessionHandshakeInterceptor interceptor = new HttpSessionHandshakeInterceptor(); String origin = "http://mydomain.com"; - registration.setHandshakeHandler(handshakeHandler).addInterceptors(interceptor).setAllowedOrigins(origin).withSockJS(); + registration.setHandshakeHandler(handshakeHandler) + .addInterceptors(interceptor).setAllowedOrigins(origin).withSockJS(); MultiValueMap mappings = registration.getMappings(); assertEquals(1, mappings.size()); diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/ClientSockJsSessionTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/ClientSockJsSessionTests.java index 791aa387af5..3617da5672a 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/ClientSockJsSessionTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/ClientSockJsSessionTests.java @@ -129,8 +129,10 @@ public class ClientSockJsSessionTests { @Test public void handleFrameMessageWithWebSocketHandlerException() throws Exception { this.session.handleFrame(SockJsFrame.openFrame().getContent()); - willThrow(new IllegalStateException("Fake error")).given(this.handler).handleMessage(this.session, new TextMessage("foo")); - willThrow(new IllegalStateException("Fake error")).given(this.handler).handleMessage(this.session, new TextMessage("bar")); + willThrow(new IllegalStateException("Fake error")).given(this.handler) + .handleMessage(this.session, new TextMessage("foo")); + willThrow(new IllegalStateException("Fake error")).given(this.handler) + .handleMessage(this.session, new TextMessage("bar")); this.session.handleFrame(SockJsFrame.messageFrame(CODEC, "foo", "bar").getContent()); assertThat(this.session.isOpen(), equalTo(true)); verify(this.handler).afterConnectionEstablished(this.session); diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransportTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransportTests.java index 69e7fd888bc..1e8f942f842 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransportTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransportTests.java @@ -207,7 +207,9 @@ public class RestTemplateXhrTransportTests { } @Override - public T execute(URI url, HttpMethod method, @Nullable RequestCallback callback, @Nullable ResponseExtractor extractor) throws RestClientException { + public T execute(URI url, HttpMethod method, @Nullable RequestCallback callback, + @Nullable ResponseExtractor extractor) throws RestClientException { + try { extractor.extractData(this.responses.remove()); } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/support/SockJsServiceTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/support/SockJsServiceTests.java index 6767120e965..f759bb49b3a 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/support/SockJsServiceTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/support/SockJsServiceTests.java @@ -18,6 +18,7 @@ package org.springframework.web.socket.sockjs.support; import java.io.IOException; import java.util.Arrays; +import java.util.List; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; @@ -84,7 +85,8 @@ public class SockJsServiceTests extends AbstractHttpRequestTests { resetResponseAndHandleRequest("GET", "/echo/info", HttpStatus.OK); assertEquals("application/json;charset=UTF-8", this.servletResponse.getContentType()); - assertEquals("no-store, no-cache, must-revalidate, max-age=0", this.servletResponse.getHeader(HttpHeaders.CACHE_CONTROL)); + String header = this.servletResponse.getHeader(HttpHeaders.CACHE_CONTROL); + assertEquals("no-store, no-cache, must-revalidate, max-age=0", header); assertNull(this.servletResponse.getHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); assertNull(this.servletResponse.getHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)); assertNull(this.servletResponse.getHeader(HttpHeaders.VARY)); @@ -116,15 +118,18 @@ public class SockJsServiceTests extends AbstractHttpRequestTests { resetResponseAndHandleRequest("GET", "/echo/info", HttpStatus.OK); assertEquals("application/json;charset=UTF-8", this.servletResponse.getContentType()); - assertEquals("no-store, no-cache, must-revalidate, max-age=0", this.servletResponse.getHeader(HttpHeaders.CACHE_CONTROL)); + String header = this.servletResponse.getHeader(HttpHeaders.CACHE_CONTROL); + assertEquals("no-store, no-cache, must-revalidate, max-age=0", header); String body = this.servletResponse.getContentAsString(); assertEquals("{\"entropy\"", body.substring(0, body.indexOf(':'))); - assertEquals(",\"origins\":[\"*:*\"],\"cookie_needed\":true,\"websocket\":true}", body.substring(body.indexOf(','))); + assertEquals(",\"origins\":[\"*:*\"],\"cookie_needed\":true,\"websocket\":true}", + body.substring(body.indexOf(','))); this.service.setAllowedOrigins(Arrays.asList("http://mydomain1.com")); resetResponseAndHandleRequest("GET", "/echo/info", HttpStatus.OK); - this.service.setAllowedOrigins(Arrays.asList("http://mydomain1.com", "http://mydomain2.com", "http://mydomain3.com")); + List origins = Arrays.asList("http://mydomain1.com", "http://mydomain2.com", "http://mydomain3.com"); + this.service.setAllowedOrigins(origins); resetResponseAndHandleRequest("GET", "/echo/info", HttpStatus.OK); this.service.setAllowedOrigins(Arrays.asList("*")); @@ -183,7 +188,8 @@ public class SockJsServiceTests extends AbstractHttpRequestTests { resetResponseAndHandleRequest("OPTIONS", "/echo/info", HttpStatus.NO_CONTENT); assertNotNull(this.service.getCorsConfiguration(this.servletRequest)); - this.service.setAllowedOrigins(Arrays.asList("http://mydomain1.com", "http://mydomain2.com", "http://mydomain3.com")); + List origins = Arrays.asList("http://mydomain1.com", "http://mydomain2.com", "http://mydomain3.com"); + this.service.setAllowedOrigins(origins); resetResponseAndHandleRequest("OPTIONS", "/echo/info", HttpStatus.NO_CONTENT); assertNotNull(this.service.getCorsConfiguration(this.servletRequest)); @@ -210,7 +216,8 @@ public class SockJsServiceTests extends AbstractHttpRequestTests { resetResponseAndHandleRequest("OPTIONS", "/echo/info", HttpStatus.FORBIDDEN); assertNull(this.service.getCorsConfiguration(this.servletRequest)); - this.service.setAllowedOrigins(Arrays.asList("http://mydomain1.com", "http://mydomain2.com", "http://mydomain3.com")); + List origins = Arrays.asList("http://mydomain1.com", "http://mydomain2.com", "http://mydomain3.com"); + this.service.setAllowedOrigins(origins); resetResponseAndHandleRequest("OPTIONS", "/echo/info", HttpStatus.NO_CONTENT); assertNull(this.service.getCorsConfiguration(this.servletRequest)); } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java index a45a3e701b4..02cf2a6ce17 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java @@ -270,7 +270,8 @@ public class DefaultSockJsServiceTests extends AbstractHttpRequestTests { @Test public void handleTransportRequestJsonp() throws Exception { - TransportHandlingSockJsService jsonpService = new TransportHandlingSockJsService(this.taskScheduler, this.jsonpHandler, this.jsonpSendHandler); + TransportHandlingSockJsService jsonpService = new TransportHandlingSockJsService( + this.taskScheduler, this.jsonpHandler, this.jsonpSendHandler); String sockJsPath = sessionUrlPrefix+ "jsonp"; setRequest("GET", sockJsPrefix + sockJsPath); jsonpService.handleRequest(this.request, this.response, sockJsPath, this.wsHandler); @@ -291,7 +292,8 @@ public class DefaultSockJsServiceTests extends AbstractHttpRequestTests { @Test public void handleTransportRequestWebsocket() throws Exception { - TransportHandlingSockJsService wsService = new TransportHandlingSockJsService(this.taskScheduler, this.wsTransportHandler); + TransportHandlingSockJsService wsService = new TransportHandlingSockJsService( + this.taskScheduler, this.wsTransportHandler); String sockJsPath = "/websocket"; setRequest("GET", sockJsPrefix + sockJsPath); wsService.handleRequest(this.request, this.response, sockJsPath, this.wsHandler);