Polish Jackson 3 support
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
Deploy Docs / Dispatch docs deployment (push) Waiting to run Details

- Improve Javadoc.

- Suppress warnings for "removal".

- Update copyright headers.

- Migrate several tests from:
  - MappingJackson2MessageConverter to JacksonJsonMessageConverter
  - Jackson2JsonEncoder to JacksonJsonEncoder
  - Jackson2JsonDecoder to JacksonJsonDecoder
  - Jackson2SmileEncoder to JacksonSmileEncoder
  - Jackson2ObjectMapperBuilder to JsonMapper and XmlMapper
  - MappingJackson2JsonView to JacksonJsonView
  - MappingJackson2HttpMessageConverter to JacksonJsonHttpMessageConverter
  - MappingJackson2XmlHttpMessageConverter to JacksonXmlHttpMessageConverter
This commit is contained in:
Sam Brannen 2025-05-14 16:55:27 +02:00
parent ea340fbe69
commit 01fea5e7ed
88 changed files with 402 additions and 346 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -70,7 +70,8 @@ class MessagingMessageListenerAdapterTests {
@BeforeEach
void setup() {
initializeFactory(factory);
factory.setBeanFactory(new StaticListableBeanFactory());
factory.afterPropertiesSet();
}
@Test
@ -405,11 +406,6 @@ class MessagingMessageListenerAdapterTests {
return adapter;
}
private void initializeFactory(DefaultMessageHandlerMethodFactory factory) {
factory.setBeanFactory(new StaticListableBeanFactory());
factory.afterPropertiesSet();
}
@SuppressWarnings("unused")
private static class SampleBean {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -49,6 +49,7 @@ import static org.mockito.Mockito.verify;
* @author Dave Syer
* @author Stephane Nicoll
*/
@SuppressWarnings("removal")
class MappingJackson2MessageConverterTests {
private MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,7 +16,6 @@
package org.springframework.messaging.core;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@ -38,29 +37,20 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
*/
class DestinationResolvingMessagingTemplateTests {
private TestDestinationResolvingMessagingTemplate template;
private final TestDestinationResolvingMessagingTemplate template = new TestDestinationResolvingMessagingTemplate();
private ExecutorSubscribableChannel myChannel;
private final ExecutorSubscribableChannel myChannel = new ExecutorSubscribableChannel();
private Map<String, Object> headers;
private final Map<String, Object> headers = Map.of("key", "value");
private TestMessagePostProcessor postProcessor;
private final TestMessagePostProcessor postProcessor = new TestMessagePostProcessor();
@BeforeEach
void setup() {
TestMessageChannelDestinationResolver resolver = new TestMessageChannelDestinationResolver();
this.myChannel = new ExecutorSubscribableChannel();
resolver.registerMessageChannel("myChannel", this.myChannel);
this.template = new TestDestinationResolvingMessagingTemplate();
this.template.setDestinationResolver(resolver);
this.headers = Collections.singletonMap("key", "value");
this.postProcessor = new TestMessagePostProcessor();
}
@ -76,8 +66,8 @@ class DestinationResolvingMessagingTemplateTests {
@Test
void sendNoDestinationResolver() {
TestDestinationResolvingMessagingTemplate template = new TestDestinationResolvingMessagingTemplate();
assertThatIllegalStateException().isThrownBy(() ->
template.send("myChannel", new GenericMessage<>("payload")));
assertThatIllegalStateException()
.isThrownBy(() -> template.send("myChannel", new GenericMessage<>("payload")));
}
@Test
@ -240,19 +230,21 @@ class DestinationResolvingMessagingTemplateTests {
}
}
}
class TestMessageChannelDestinationResolver implements DestinationResolver<MessageChannel> {
private static class TestMessageChannelDestinationResolver implements DestinationResolver<MessageChannel> {
private final Map<String, MessageChannel> channels = new HashMap<>();
private final Map<String, MessageChannel> channels = new HashMap<>();
public void registerMessageChannel(String name, MessageChannel channel) {
this.channels.put(name, channel);
public void registerMessageChannel(String name, MessageChannel channel) {
this.channels.put(name, channel);
}
@Override
public MessageChannel resolveDestination(String name) throws DestinationResolutionException {
return this.channels.get(name);
}
}
@Override
public MessageChannel resolveDestination(String name) throws DestinationResolutionException {
return this.channels.get(name);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -21,13 +21,12 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.converter.CompositeMessageConverter;
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
import org.springframework.messaging.converter.JacksonJsonMessageConverter;
import org.springframework.messaging.converter.MessageConversionException;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.converter.StringMessageConverter;
@ -47,21 +46,15 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
*/
class MessageSendingTemplateTests {
private TestMessageSendingTemplate template;
private final TestMessageSendingTemplate template = new TestMessageSendingTemplate();
private TestMessagePostProcessor postProcessor;
private final TestMessagePostProcessor postProcessor = new TestMessagePostProcessor();
private Map<String, Object> headers;
private final Map<String, Object> headers = new HashMap<>() {{
put("key", "value");
}};
@BeforeEach
void setup() {
this.template = new TestMessageSendingTemplate();
this.postProcessor = new TestMessagePostProcessor();
this.headers = new HashMap<>();
this.headers.put("key", "value");
}
@Test
void send() {
Message<?> message = new GenericMessage<Object>("payload");
@ -84,8 +77,7 @@ class MessageSendingTemplateTests {
@Test
void sendMissingDestination() {
Message<?> message = new GenericMessage<Object>("payload");
assertThatIllegalStateException().isThrownBy(() ->
this.template.send(message));
assertThatIllegalStateException().isThrownBy(() -> this.template.send(message));
}
@Test
@ -177,14 +169,12 @@ class MessageSendingTemplateTests {
@Test
void convertAndSendNoMatchingConverter() {
MessageConverter converter = new CompositeMessageConverter(
List.of(new MappingJackson2MessageConverter()));
MessageConverter converter = new CompositeMessageConverter(List.of(new JacksonJsonMessageConverter()));
this.template.setMessageConverter(converter);
this.headers.put(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_XML);
assertThatExceptionOfType(MessageConversionException.class).isThrownBy(() ->
this.template.convertAndSend("home", "payload", new MessageHeaders(this.headers)));
assertThatExceptionOfType(MessageConversionException.class)
.isThrownBy(() -> this.template.convertAndSend("home", "payload", new MessageHeaders(this.headers)));
}
@ -202,19 +192,3 @@ class MessageSendingTemplateTests {
}
}
class TestMessagePostProcessor implements MessagePostProcessor {
private Message<?> message;
Message<?> getMessage() {
return this.message;
}
@Override
public Message<?> postProcessMessage(Message<?> message) {
this.message = message;
return message;
}
}

View File

@ -0,0 +1,36 @@
/*
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.messaging.core;
import org.springframework.messaging.Message;
public class TestMessagePostProcessor implements MessagePostProcessor {
private Message<?> message;
Message<?> getMessage() {
return this.message;
}
@Override
public Message<?> postProcessMessage(Message<?> message) {
this.message = message;
return message;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -218,6 +218,7 @@ class MessageMethodArgumentResolverTests {
}
@Test // SPR-16486
@SuppressWarnings("removal")
public void resolveWithJacksonConverter() throws Exception {
Message<String> inMessage = MessageBuilder.withPayload("{\"foo\":\"bar\"}").build();
MethodParameter parameter = new MethodParameter(this.method, 5);

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -31,8 +31,9 @@ import org.springframework.http.codec.AbstractJacksonDecoder;
import org.springframework.util.MimeType;
/**
* Decode bytes into CBOR and convert to Object's with Jackson 3.x.
* Stream decoding is not supported yet.
* Decode bytes into CBOR and convert to Objects with Jackson 3.x.
*
* <p>Stream decoding is currently not supported.
*
* @author Sebastien Deleuze
* @since 7.0
@ -70,7 +71,8 @@ public class JacksonCborDecoder extends AbstractJacksonDecoder {
@Override
public Flux<Object> decode(Publisher<DataBuffer> input, ResolvableType elementType, @Nullable MimeType mimeType,
@Nullable Map<String, Object> hints) {
throw new UnsupportedOperationException("Does not support stream decoding yet");
throw new UnsupportedOperationException("Stream decoding is currently not supported");
}
}

View File

@ -33,7 +33,8 @@ import org.springframework.util.MimeType;
/**
* Encode from an {@code Object} to bytes of CBOR objects using Jackson 3.x.
* Stream encoding is not supported yet.
*
* <p>Stream encoding is currently not supported.
*
* @author Sebastien Deleuze
* @since 7.0
@ -73,7 +74,8 @@ public class JacksonCborEncoder extends AbstractJacksonEncoder {
@Override
public Flux<DataBuffer> encode(Publisher<?> inputStream, DataBufferFactory bufferFactory, ResolvableType elementType,
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
throw new UnsupportedOperationException("Does not support stream encoding yet");
throw new UnsupportedOperationException("Stream encoding is currently not supported");
}
}

View File

@ -23,7 +23,7 @@ import org.springframework.http.codec.AbstractJacksonDecoder;
import org.springframework.util.MimeType;
/**
* Decode a byte stream into Smile and convert to Object's with Jackson 3.x,
* Decode a byte stream into Smile and convert to Objects with Jackson 3.x,
* leveraging non-blocking parsing.
*
* <p>The default constructor loads {@link tools.jackson.databind.JacksonModule}s
@ -39,6 +39,7 @@ public class JacksonSmileDecoder extends AbstractJacksonDecoder {
new MimeType("application", "x-jackson-smile"),
new MimeType("application", "*+x-jackson-smile")};
/**
* Construct a new instance with a {@link SmileMapper} customized with the
* {@link tools.jackson.databind.JacksonModule}s found by

View File

@ -30,8 +30,9 @@ import org.springframework.util.MimeType;
/**
* Encode from an {@code Object} stream to a byte stream of Smile objects using Jackson 3.x.
* For non-streaming use cases, {@link Flux} elements are collected into a {@link List}
* before serialization for performance reason.
*
* <p>For non-streaming use cases, {@link Flux} elements are collected into a {@link List}
* before serialization for performance reasons.
*
* <p>The default constructor loads {@link tools.jackson.databind.JacksonModule}s
* found by {@link MapperBuilder#findModules(ClassLoader)}.
@ -98,4 +99,5 @@ public class JacksonSmileEncoder extends AbstractJacksonEncoder {
}
return null;
}
}

View File

@ -111,7 +111,7 @@ public abstract class AbstractJacksonHttpMessageConverter extends AbstractSmartH
/**
* Construct a new instance with a provided {@link MapperBuilder builder}
* Construct a new instance with the provided {@link MapperBuilder builder}
* customized with the {@link tools.jackson.databind.JacksonModule}s found
* by {@link MapperBuilder#findModules(ClassLoader)}.
*/
@ -141,7 +141,7 @@ public abstract class AbstractJacksonHttpMessageConverter extends AbstractSmartH
}
/**
* Construct a new instance with a provided {@link ObjectMapper}.
* Construct a new instance with the provided {@link ObjectMapper}.
*/
protected AbstractJacksonHttpMessageConverter(ObjectMapper objectMapper) {
this.defaultObjectMapper = objectMapper;
@ -367,10 +367,10 @@ public abstract class AbstractJacksonHttpMessageConverter extends AbstractSmartH
}
/**
* Subclasses can use this method to customize {@link ObjectReader} used
* Subclasses can use this method to customize the {@link ObjectReader} used
* for reading values.
* @param reader the reader instance to customize
* @param javaType the target type of element values to read to
* @param javaType the type of element values to read
* @return the customized {@link ObjectReader}
*/
protected ObjectReader customizeReader(ObjectReader reader, JavaType javaType) {
@ -380,7 +380,7 @@ public abstract class AbstractJacksonHttpMessageConverter extends AbstractSmartH
/**
* Determine the charset to use for JSON input.
* <p>By default this is either the charset from the input {@code MediaType}
* or otherwise falling back on {@code UTF-8}. Can be overridden in subclasses.
* or otherwise {@code UTF-8}. Can be overridden in subclasses.
* @param contentType the content type of the HTTP input message
* @return the charset to use
*/
@ -448,7 +448,7 @@ public abstract class AbstractJacksonHttpMessageConverter extends AbstractSmartH
}
/**
* Subclasses can use this method to customize {@link ObjectWriter} used
* Subclasses can use this method to customize the {@link ObjectWriter} used
* for writing values.
* @param writer the writer instance to customize
* @param javaType the type of element values to write
@ -464,7 +464,7 @@ public abstract class AbstractJacksonHttpMessageConverter extends AbstractSmartH
/**
* Write a prefix before the main content.
* @param generator the generator to use for writing content.
* @param object the object to write to the output message.
* @param object the object to write to the output message
*/
protected void writePrefix(JsonGenerator generator, Object object) {
}
@ -472,7 +472,7 @@ public abstract class AbstractJacksonHttpMessageConverter extends AbstractSmartH
/**
* Write a suffix after the main content.
* @param generator the generator to use for writing content.
* @param object the object to write to the output message.
* @param object the object to write to the output message
*/
protected void writeSuffix(JsonGenerator generator, Object object) {
}
@ -508,4 +508,5 @@ public abstract class AbstractJacksonHttpMessageConverter extends AbstractSmartH
protected boolean supportsRepeatableWrites(Object o) {
return true;
}
}

View File

@ -65,7 +65,7 @@ public class JacksonXmlHttpMessageConverter extends AbstractJacksonHttpMessageCo
};
/**
* Construct a new instance with a {@link XmlMapper} created from
* Construct a new instance with an {@link XmlMapper} created from
* {@link #defensiveXmlFactory} and customized with the
* {@link tools.jackson.databind.JacksonModule}s found by
* {@link MapperBuilder#findModules(ClassLoader)} and

View File

@ -35,21 +35,21 @@ import tools.jackson.databind.ser.VirtualBeanPropertyWriter;
import tools.jackson.databind.util.Converter;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.util.Assert;
/**
* Allows for creating Jackson 3.x ({@link ValueSerializer}, {@link ValueDeserializer},
* {@link KeyDeserializer}, {@link TypeResolverBuilder}, {@link TypeIdResolver})
* beans with autowiring against a Spring {@link ApplicationContext}.
* {@link KeyDeserializer}, {@link TypeResolverBuilder}, and {@link TypeIdResolver})
* beans with autowiring against a Spring {@code ApplicationContext}.
*
* <p>Also overrides all factory methods in {@link HandlerInstantiator},
* including non-abstract ones for {@link ValueInstantiator}, {@link ObjectIdGenerator}, {@link ObjectIdResolver},
* {@link PropertyNamingStrategy}, {@link Converter}, {@link VirtualBeanPropertyWriter}.
* including non-abstract methods for {@link ValueInstantiator}, {@link ObjectIdGenerator},
* {@link ObjectIdResolver}, {@link PropertyNamingStrategy}, {@link Converter}, and
* {@link VirtualBeanPropertyWriter}.
*
* @author Sebastien Deleuze
* @since 7.0
* @see ApplicationContext#getAutowireCapableBeanFactory()
* @see org.springframework.context.ApplicationContext#getAutowireCapableBeanFactory()
* @see tools.jackson.databind.cfg.HandlerInstantiator
*/
public class JacksonHandlerInstantiator extends HandlerInstantiator {
@ -58,7 +58,7 @@ public class JacksonHandlerInstantiator extends HandlerInstantiator {
/**
* Create a new AutowiredHandlerInstantiator for the given BeanFactory.
* Create a new {@code JacksonHandlerInstantiator} for the given BeanFactory.
* @param beanFactory the target BeanFactory
*/
public JacksonHandlerInstantiator(AutowireCapableBeanFactory beanFactory) {
@ -66,6 +66,7 @@ public class JacksonHandlerInstantiator extends HandlerInstantiator {
this.beanFactory = beanFactory;
}
@Override
@Nullable
public ValueDeserializer<?> deserializerInstance(DeserializationConfig config, Annotated annotated, Class<?> deserClass) {
@ -94,25 +95,21 @@ public class JacksonHandlerInstantiator extends HandlerInstantiator {
@Override
public ValueInstantiator valueInstantiatorInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
return (ValueInstantiator) this.beanFactory.createBean(implClass);
}
@Override
public ObjectIdGenerator<?> objectIdGeneratorInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
return (ObjectIdGenerator<?>) this.beanFactory.createBean(implClass);
}
@Override
public ObjectIdResolver resolverIdGeneratorInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
return (ObjectIdResolver) this.beanFactory.createBean(implClass);
}
@Override
public PropertyNamingStrategy namingStrategyInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
return (PropertyNamingStrategy) this.beanFactory.createBean(implClass);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -39,7 +39,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ReactiveHttpOutputMessage;
import org.springframework.http.client.MultipartBodyBuilder;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.json.JacksonJsonEncoder;
import org.springframework.http.codec.multipart.MultipartHttpMessageWriter;
import org.springframework.http.codec.protobuf.ProtobufDecoder;
import org.springframework.http.codec.protobuf.ProtobufEncoder;
@ -76,7 +76,7 @@ class CancelWithoutDemandCodecTests {
@Test // gh-22107
public void cancelWithJackson() {
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
JacksonJsonEncoder encoder = new JacksonJsonEncoder();
Flux<DataBuffer> flux = encoder.encode(Flux.just(new Pojo("foofoo", "barbar"), new Pojo("bar", "baz")),
this.bufferFactory, ResolvableType.forClass(Pojo.class),
@ -150,7 +150,7 @@ class CancelWithoutDemandCodecTests {
@Test // gh-22107
public void cancelWithSse() {
ServerSentEvent<?> event = ServerSentEvent.builder().data("bar").id("c42").event("foo").build();
ServerSentEventHttpMessageWriter writer = new ServerSentEventHttpMessageWriter(new Jackson2JsonEncoder());
ServerSentEventHttpMessageWriter writer = new ServerSentEventHttpMessageWriter(new JacksonJsonEncoder());
CancellingOutputMessage outputMessage = new CancellingOutputMessage(this.bufferFactory);
writer.write(Mono.just(event), ResolvableType.forClass(ServerSentEvent.class), MediaType.TEXT_EVENT_STREAM,
@ -229,4 +229,5 @@ class CancelWithoutDemandCodecTests {
// Just subscribe without requesting
}
}
}

View File

@ -24,7 +24,6 @@ import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.UnpooledByteBufAllocator;
import org.json.JSONException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.skyscreamer.jsonassert.JSONAssert;
import reactor.core.publisher.Flux;
@ -50,16 +49,11 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link JacksonTokenizer}.
*
* @author Sebastien Deleuze
* @since 7.0
*/
class JacksonTokenizerTests extends AbstractLeakCheckingTests {
private ObjectMapper objectMapper;
@BeforeEach
void createParser() {
this.objectMapper = JsonMapper.builder().build();
}
private final ObjectMapper objectMapper = JsonMapper.builder().build();
@Test

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -30,7 +30,6 @@ import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferLimitException;
import org.springframework.core.testfixture.io.buffer.AbstractLeakCheckingTests;
import org.springframework.http.MediaType;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.JacksonJsonDecoder;
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
import org.springframework.web.testfixture.xml.Pojo;
@ -227,7 +226,7 @@ class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingTests {
String content = "data:{\"foo\": \"" + fooValue + "\"}\n\n";
MockServerHttpRequest request = MockServerHttpRequest.post("/").body(Mono.just(stringBuffer(content)));
Jackson2JsonDecoder jacksonDecoder = new Jackson2JsonDecoder();
JacksonJsonDecoder jacksonDecoder = new JacksonJsonDecoder();
ServerSentEventHttpMessageReader messageReader = new ServerSentEventHttpMessageReader(jacksonDecoder);
jacksonDecoder.setMaxInMemorySize(limit + 1024);

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -35,6 +35,7 @@ import org.springframework.core.testfixture.codec.AbstractDecoderTests;
*
* @author Jason Laber
*/
@SuppressWarnings("removal")
class CustomizedJackson2JsonDecoderTests extends AbstractDecoderTests<Jackson2JsonDecoder> {
CustomizedJackson2JsonDecoderTests() {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -35,6 +35,7 @@ import static org.springframework.http.MediaType.APPLICATION_NDJSON;
*
* @author Jason Laber
*/
@SuppressWarnings("removal")
class CustomizedJackson2JsonEncoderTests extends AbstractEncoderTests<Jackson2JsonEncoder> {
CustomizedJackson2JsonEncoderTests() {

View File

@ -34,6 +34,7 @@ import org.springframework.core.testfixture.codec.AbstractDecoderTests;
* Tests for a customized {@link JacksonJsonDecoder}.
*
* @author Sebastien Deleuze
* @since 7.0
*/
class CustomizedJacksonJsonDecoderTests extends AbstractDecoderTests<JacksonJsonDecoder> {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -54,7 +54,6 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.http.MediaType.APPLICATION_NDJSON;
import static org.springframework.http.MediaType.APPLICATION_XML;
import static org.springframework.http.codec.json.Jackson2CodecSupport.JSON_VIEW_HINT;
/**
* Tests for {@link Jackson2JsonDecoder}.
@ -201,7 +200,8 @@ class Jackson2JsonDecoderTests extends AbstractDecoderTests<Jackson2JsonDecoder>
"{\"withView1\" : \"with\", \"withView2\" : \"with\", \"withoutView\" : \"without\"}"));
ResolvableType elementType = ResolvableType.forClass(JacksonViewBean.class);
Map<String, Object> hints = Collections.singletonMap(JSON_VIEW_HINT, MyJacksonView1.class);
Map<String, Object> hints = Map.of(
org.springframework.http.codec.json.Jackson2CodecSupport.JSON_VIEW_HINT, MyJacksonView1.class);
testDecode(input, elementType, step -> step
.consumeNextWith(value -> {
@ -218,7 +218,8 @@ class Jackson2JsonDecoderTests extends AbstractDecoderTests<Jackson2JsonDecoder>
"{\"withView1\" : \"with\", \"withView2\" : \"with\", \"withoutView\" : \"without\"}"));
ResolvableType elementType = ResolvableType.forClass(JacksonViewBean.class);
Map<String, Object> hints = Collections.singletonMap(JSON_VIEW_HINT, MyJacksonView3.class);
Map<String, Object> hints = Map.of(
org.springframework.http.codec.json.Jackson2CodecSupport.JSON_VIEW_HINT, MyJacksonView3.class);
testDecode(input, elementType, step -> step
.consumeNextWith(value -> {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -39,6 +39,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON;
*
* @author Sebastien Deleuze
*/
@SuppressWarnings("removal")
class Jackson2SmileDecoderTests extends AbstractDecoderTests<Jackson2SmileDecoder> {
private static final MimeType SMILE_MIME_TYPE = new MimeType("application", "x-jackson-smile");

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -46,16 +46,15 @@ import static org.springframework.http.MediaType.APPLICATION_XML;
*
* @author Sebastien Deleuze
*/
@SuppressWarnings("removal")
class Jackson2SmileEncoderTests extends AbstractEncoderTests<Jackson2SmileEncoder> {
private static final MimeType SMILE_MIME_TYPE = new MimeType("application", "x-jackson-smile");
private static final MimeType STREAM_SMILE_MIME_TYPE = new MimeType("application", "stream+x-jackson-smile");
private final Jackson2SmileEncoder encoder = new Jackson2SmileEncoder();
private final ObjectMapper mapper = Jackson2ObjectMapperBuilder.smile().build();
public Jackson2SmileEncoderTests() {
Jackson2SmileEncoderTests() {
super(new Jackson2SmileEncoder());
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -54,6 +54,7 @@ import static org.assertj.core.api.Assertions.fail;
* @author Rossen Stoyanchev
* @author Juergen Hoeller
*/
@SuppressWarnings("removal")
class Jackson2TokenizerTests extends AbstractLeakCheckingTests {
private JsonFactory jsonFactory;

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -39,6 +39,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link AbstractJackson2Encoder} for the CSV variant and how resources are managed.
* @author Brian Clozel
*/
@SuppressWarnings("removal")
class JacksonCsvEncoderTests extends AbstractEncoderTests<org.springframework.http.codec.json.JacksonCsvEncoderTests.JacksonCsvEncoder> {
public JacksonCsvEncoderTests() {

View File

@ -60,6 +60,7 @@ import static org.springframework.http.codec.JacksonCodecSupport.JSON_VIEW_HINT;
* Tests for {@link JacksonJsonDecoder}.
*
* @author Sebastien Deleuze
* @since 7.0
*/
class JacksonJsonDecoderTests extends AbstractDecoderTests<JacksonJsonDecoder> {
@ -73,8 +74,8 @@ class JacksonJsonDecoderTests extends AbstractDecoderTests<JacksonJsonDecoder> {
}
@Override
@Test
@Override
public void canDecode() {
assertThat(decoder.canDecode(ResolvableType.forClass(Pojo.class), APPLICATION_JSON)).isTrue();
assertThat(decoder.canDecode(ResolvableType.forClass(Pojo.class), APPLICATION_NDJSON)).isTrue();
@ -109,7 +110,6 @@ class JacksonJsonDecoderTests extends AbstractDecoderTests<JacksonJsonDecoder> {
assertThat(decoder.canDecode(ResolvableType.forClass(Pojo.class), MediaType.APPLICATION_JSON)).isTrue();
assertThat(decoder.canDecode(ResolvableType.forClass(Pojo.class), halFormsJsonMediaType)).isFalse();
assertThat(decoder.canDecode(ResolvableType.forClass(Map.class), MediaType.APPLICATION_JSON)).isTrue();
}
@Test // SPR-15866
@ -142,8 +142,8 @@ class JacksonJsonDecoderTests extends AbstractDecoderTests<JacksonJsonDecoder> {
.containsExactly(mimeType1);
}
@Override
@Test
@Override
protected void decode() {
Flux<DataBuffer> input = Flux.concat(
stringBuffer("[{\"bar\":\"b1\",\"foo\":\"f1\"},"),
@ -155,8 +155,8 @@ class JacksonJsonDecoderTests extends AbstractDecoderTests<JacksonJsonDecoder> {
.verifyComplete());
}
@Override
@Test
@Override
protected void decodeToMono() {
Flux<DataBuffer> input = Flux.concat(
stringBuffer("[{\"bar\":\"b1\",\"foo\":\"f1\"},"),
@ -260,7 +260,7 @@ class JacksonJsonDecoderTests extends AbstractDecoderTests<JacksonJsonDecoder> {
void codecException() {
Flux<DataBuffer> input = Flux.from(stringBuffer("["));
ResolvableType elementType = ResolvableType.forClass(BeanWithNoDefaultConstructor.class);
Flux<Object> flux = new Jackson2JsonDecoder().decode(input, elementType, null, Collections.emptyMap());
Flux<Object> flux = new JacksonJsonDecoder().decode(input, elementType, null, Collections.emptyMap());
StepVerifier.create(flux).verifyError(CodecException.class);
}

View File

@ -55,7 +55,9 @@ import static org.springframework.http.codec.JacksonCodecSupport.JSON_VIEW_HINT;
/**
* Tests for {@link JacksonJsonEncoder}.
*
* @author Sebastien Deleuze
* @since 7.0
*/
class JacksonJsonEncoderTests extends AbstractEncoderTests<JacksonJsonEncoder> {
@ -63,8 +65,9 @@ class JacksonJsonEncoderTests extends AbstractEncoderTests<JacksonJsonEncoder> {
super(new JacksonJsonEncoder());
}
@Override
@Test
@Override
@SuppressWarnings("removal")
public void canEncode() {
ResolvableType pojoType = ResolvableType.forClass(Pojo.class);
assertThat(this.encoder.canEncode(pojoType, APPLICATION_JSON)).isTrue();
@ -88,8 +91,8 @@ class JacksonJsonEncoderTests extends AbstractEncoderTests<JacksonJsonEncoder> {
.isInstanceOf(UnsupportedOperationException.class);
}
@Override
@Test
@Override
public void encode() throws Exception {
Flux<Object> input = Flux.just(new Pojo("foo", "bar"),
new Pojo("foofoo", "barbar"),

View File

@ -36,6 +36,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON;
* Tests for {@link JacksonSmileDecoder}.
*
* @author Sebastien Deleuze
* @since 7.0
*/
class JacksonSmileDecoderTests extends AbstractDecoderTests<JacksonSmileDecoder> {
@ -48,10 +49,12 @@ class JacksonSmileDecoderTests extends AbstractDecoderTests<JacksonSmileDecoder>
private SmileMapper mapper = SmileMapper.builder().build();
public JacksonSmileDecoderTests() {
JacksonSmileDecoderTests() {
super(new JacksonSmileDecoder());
}
@Override
@Test
protected void canDecode() {

View File

@ -19,6 +19,7 @@ package org.springframework.http.codec.smile;
import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@ -31,7 +32,6 @@ import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.testfixture.codec.AbstractEncoderTests;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.http.codec.json.Jackson2SmileEncoder;
import org.springframework.util.MimeType;
import org.springframework.web.testfixture.xml.Pojo;
@ -43,23 +43,23 @@ import static org.springframework.http.MediaType.APPLICATION_XML;
* Tests for {@link JacksonSmileEncoder}.
*
* @author Sebastien Deleuze
* @since 7.0
*/
class JacksonSmileEncoderTests extends AbstractEncoderTests<JacksonSmileEncoder> {
private static final MimeType SMILE_MIME_TYPE = new MimeType("application", "x-jackson-smile");
private static final MimeType STREAM_SMILE_MIME_TYPE = new MimeType("application", "stream+x-jackson-smile");
private final Jackson2SmileEncoder encoder = new Jackson2SmileEncoder();
private final SmileMapper mapper = SmileMapper.builder().build();
public JacksonSmileEncoderTests() {
super(new JacksonSmileEncoder());
JacksonSmileEncoderTests() {
super(new JacksonSmileEncoder());
}
@Override
@Test
@Override
protected void canEncode() {
ResolvableType pojoType = ResolvableType.forClass(Pojo.class);
assertThat(this.encoder.canEncode(pojoType, SMILE_MIME_TYPE)).isTrue();
@ -71,16 +71,20 @@ class JacksonSmileEncoderTests extends AbstractEncoderTests<JacksonSmileEncoder>
}
@Test
void canNotEncode() {
void cannotEncode() {
assertThat(this.encoder.canEncode(ResolvableType.forClass(String.class), null)).isFalse();
assertThat(this.encoder.canEncode(ResolvableType.forClass(Pojo.class), APPLICATION_XML)).isFalse();
}
@Test
@Disabled("Determine why this fails with JacksonSmileEncoder but passes with Jackson2SmileEncoder")
void cannotEncodeServerSentEvent() {
ResolvableType sseType = ResolvableType.forClass(ServerSentEvent.class);
assertThat(this.encoder.canEncode(sseType, SMILE_MIME_TYPE)).isFalse();
}
@Override
@Test
@Override
protected void encode() {
List<Pojo> list = Arrays.asList(
new Pojo("foo", "bar"),

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -72,7 +72,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
* @author Sebastien Deleuze
* @author Sam Brannen
*/
@SuppressWarnings("deprecation")
@SuppressWarnings({"deprecation", "removal" })
public class Jackson2ObjectMapperFactoryBeanTests {
private static final String DATE_FORMAT = "yyyy-MM-dd";

View File

@ -98,6 +98,7 @@ class JacksonJsonHttpMessageConverterTests {
}
@Test
@SuppressWarnings("removal")
void canWrite() {
assertThat(converter.canWrite(MyBean.class, MediaType.APPLICATION_JSON)).isTrue();
assertThat(converter.canWrite(Map.class, MediaType.APPLICATION_JSON)).isTrue();
@ -331,8 +332,8 @@ class JacksonJsonHttpMessageConverterTests {
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes(StandardCharsets.UTF_8));
inputMessage.getHeaders().setContentType(MediaType.APPLICATION_JSON);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
List<MyBean> results = (List<MyBean>) converter.read(beansList.getType(), null, inputMessage);
JacksonJsonHttpMessageConverter converter = new JacksonJsonHttpMessageConverter();
List<MyBean> results = (List<MyBean>) converter.read(ResolvableType.forType(beansList), inputMessage, null);
assertThat(results).hasSize(1);
MyBean result = results.get(0);
assertThat(result.getString()).isEqualTo("Foo");
@ -343,12 +344,11 @@ class JacksonJsonHttpMessageConverterTests {
assertThat(result.getBytes()).isEqualTo(new byte[] {0x1, 0x2});
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
converter.write(results, baseList.getType(), MediaType.APPLICATION_JSON, outputMessage);
converter.write(results, ResolvableType.forType(baseList), MediaType.APPLICATION_JSON, outputMessage, null);
JSONAssert.assertEquals(body, outputMessage.getBodyAsString(StandardCharsets.UTF_8), true);
}
// gh-24498
@Test
@Test // gh-24498
void writeOptional() throws IOException {
ParameterizedTypeReference<Optional<MyParent>> optionalParent = new ParameterizedTypeReference<>() {};
Optional<MyParent> result = Optional.of(new Impl1());
@ -356,8 +356,7 @@ class JacksonJsonHttpMessageConverterTests {
converter.write(result, ResolvableType.forType(optionalParent.getType()),
MediaType.APPLICATION_JSON, outputMessage, null);
assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_8))
.contains("@type");
assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_8)).contains("@type");
}
@Test

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -18,9 +18,11 @@ package org.springframework.http.converter.json;
import java.net.URI;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.skyscreamer.jsonassert.JSONAssert;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;
import tools.jackson.dataformat.xml.XmlMapper;
import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
@ -36,7 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
class ProblemDetailJacksonMixinTests {
private final ObjectMapper mapper = new Jackson2ObjectMapperBuilder().build();
private final ObjectMapper mapper = JsonMapper.builder().addMixIn(ProblemDetail.class, ProblemDetailJacksonMixin.class).build();
@Test
@ -92,7 +94,7 @@ class ProblemDetailJacksonMixinTests {
@Test
void readCustomPropertyFromXml() throws Exception {
ObjectMapper xmlMapper = new Jackson2ObjectMapperBuilder().createXmlMapper(true).build();
ObjectMapper xmlMapper = XmlMapper.builder().addMixIn(ProblemDetail.class, ProblemDetailJacksonMixin.class).build();
ProblemDetail detail = xmlMapper.readValue("""
<problem xmlns="urn:ietf:rfc:7807">
<type>about:blank</type>

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -61,6 +61,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @author Sebastien Deleuze
*/
@SuppressWarnings("removal")
class SpringHandlerInstantiatorTests {
private SpringHandlerInstantiator instantiator;

View File

@ -32,6 +32,7 @@ import static org.assertj.core.api.Assertions.within;
* Jackson 3.x Smile converter tests.
*
* @author Sebastien Deleuze
* @since 7.0
*/
class JacksonSmileHttpMessageConverterTests {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -34,6 +34,7 @@ import static org.assertj.core.api.Assertions.within;
*
* @author Sebastien Deleuze
*/
@SuppressWarnings("removal")
class MappingJackson2SmileHttpMessageConverterTests {
private final MappingJackson2SmileHttpMessageConverter converter = new MappingJackson2SmileHttpMessageConverter();

View File

@ -41,6 +41,7 @@ import static org.assertj.core.api.Assertions.within;
* Jackson 3.x XML converter tests.
*
* @author Sebastien Deleuze
* @since 7.0
*/
class JacksonXmlHttpMessageConverterTests {
@ -313,6 +314,7 @@ class JacksonXmlHttpMessageConverterTests {
}
@SuppressWarnings("serial")
private static class MyXmlMapper extends XmlMapper {
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -41,6 +41,7 @@ import static org.assertj.core.api.Assertions.within;
* @author Sebastien Deleuze
* @author Rossen Stoyanchev
*/
@SuppressWarnings("removal")
class MappingJackson2XmlHttpMessageConverterTests {
private final MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -43,7 +43,7 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseCookie;
import org.springframework.http.codec.EncoderHttpMessageWriter;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.json.JacksonJsonEncoder;
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpResponse;
@ -205,7 +205,7 @@ class ServerHttpResponseTests {
throw AbortedException.beforeSend();
});
HttpMessageWriter<Object> messageWriter = new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder());
HttpMessageWriter<Object> messageWriter = new EncoderHttpMessageWriter<>(new JacksonJsonEncoder());
Mono<Void> result = messageWriter.write(Mono.just(Collections.singletonMap("foo", "bar")),
ResolvableType.forClass(Mono.class), ResolvableType.forClass(Map.class), null,
request, response, Collections.emptyMap());

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -32,7 +32,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@ -54,7 +54,7 @@ class ExtractingResponseErrorHandlerTests {
@BeforeEach
void setup() {
HttpMessageConverter<Object> converter = new MappingJackson2HttpMessageConverter();
HttpMessageConverter<Object> converter = new JacksonJsonHttpMessageConverter();
this.errorHandler = new ExtractingResponseErrorHandler(List.of(converter));
this.errorHandler.setStatusMapping(Map.of(HttpStatus.I_AM_A_TEAPOT, MyRestClientException.class));

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.core.Ordered;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.json.JacksonJsonEncoder;
import org.springframework.web.context.support.StaticWebApplicationContext;
import org.springframework.web.reactive.result.view.HttpMessageWriterView;
import org.springframework.web.reactive.result.view.UrlBasedViewResolver;
@ -85,7 +85,7 @@ class ViewResolverRegistryTests {
@Test
void defaultViews() {
View view = new HttpMessageWriterView(new Jackson2JsonEncoder());
View view = new HttpMessageWriterView(new JacksonJsonEncoder());
this.registry.defaultViews(view);
assertThat(this.registry.getDefaultViews()).containsExactly(view);

View File

@ -41,7 +41,7 @@ import org.springframework.http.MediaType;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.json.JacksonJsonEncoder;
import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
import org.springframework.util.MimeType;
@ -114,7 +114,7 @@ class WebFluxConfigurationSupportTests {
assertThat(adapter).isNotNull();
List<HttpMessageReader<?>> readers = adapter.getMessageReaders();
assertThat(readers).hasSize(15);
assertThat(readers).hasSizeGreaterThanOrEqualTo(15);
ResolvableType multiValueMapType = forClassWithGenerics(MultiValueMap.class, String.class, String.class);
@ -169,7 +169,7 @@ class WebFluxConfigurationSupportTests {
assertThat(handler.getOrder()).isEqualTo(0);
List<HttpMessageWriter<?>> writers = handler.getMessageWriters();
assertThat(writers).hasSize(15);
assertThat(writers).hasSizeGreaterThanOrEqualTo(15);
assertHasMessageWriter(writers, forClass(byte[].class), APPLICATION_OCTET_STREAM);
assertHasMessageWriter(writers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM);
@ -197,7 +197,7 @@ class WebFluxConfigurationSupportTests {
assertThat(handler.getOrder()).isEqualTo(100);
List<HttpMessageWriter<?>> writers = handler.getMessageWriters();
assertThat(writers).hasSize(15);
assertThat(writers).hasSizeGreaterThanOrEqualTo(15);
assertHasMessageWriter(writers, forClass(byte[].class), APPLICATION_OCTET_STREAM);
assertHasMessageWriter(writers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM);
@ -326,7 +326,7 @@ class WebFluxConfigurationSupportTests {
@Override
protected void configureViewResolvers(ViewResolverRegistry registry) {
registry.freeMarker();
registry.defaultViews(new HttpMessageWriterView(new Jackson2JsonEncoder()));
registry.defaultViews(new HttpMessageWriterView(new JacksonJsonEncoder()));
}
@Bean

View File

@ -47,7 +47,7 @@ import org.springframework.http.ResponseCookie;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.reactive.ClientHttpResponse;
import org.springframework.http.codec.DecoderHttpMessageReader;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.JacksonJsonDecoder;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
@ -343,7 +343,7 @@ class DefaultClientResponseTests {
given(mockExchangeStrategies.messageReaders()).willReturn(List.of(
new DecoderHttpMessageReader<>(new ByteArrayDecoder()),
new DecoderHttpMessageReader<>(new Jackson2JsonDecoder())));
new DecoderHttpMessageReader<>(new JacksonJsonDecoder())));
WebClientResponseException ex = defaultClientResponse.createException().block();
assertThat(ex.getResponseBodyAs(Map.class)).containsExactly(entry("name", "Jason"));
@ -361,7 +361,7 @@ class DefaultClientResponseTests {
given(mockExchangeStrategies.messageReaders()).willReturn(List.of(
new DecoderHttpMessageReader<>(new ByteArrayDecoder()),
new DecoderHttpMessageReader<>(new Jackson2JsonDecoder())));
new DecoderHttpMessageReader<>(new JacksonJsonDecoder())));
WebClientResponseException ex = defaultClientResponse.createException().block();
assertThat(ex.getResponseBodyAs(Map.class)).isNull();

View File

@ -143,7 +143,8 @@ public class WebClientProxyRegistryIntegrationTests {
private static class ManualListingConfig extends BaseEchoConfig {
}
private static class ManualListingRegistrar extends AbstractHttpServiceRegistrar {
static class ManualListingRegistrar extends AbstractHttpServiceRegistrar {
public ManualListingRegistrar() {
setDefaultClientType(ClientType.WEB_CLIENT);

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -57,7 +57,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.codec.DecoderHttpMessageReader;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.JacksonJsonDecoder;
import org.springframework.http.codec.multipart.FormFieldPart;
import org.springframework.http.codec.multipart.Part;
import org.springframework.util.LinkedMultiValueMap;
@ -81,7 +81,7 @@ import static org.springframework.web.reactive.function.BodyExtractors.toMono;
class DefaultServerRequestTests {
private final List<HttpMessageReader<?>> messageReaders = Arrays.asList(
new DecoderHttpMessageReader<>(new Jackson2JsonDecoder()),
new DecoderHttpMessageReader<>(new JacksonJsonDecoder()),
new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes()));

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -45,7 +45,7 @@ import org.springframework.core.codec.Decoder;
import org.springframework.http.MediaType;
import org.springframework.http.codec.DecoderHttpMessageReader;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.JacksonJsonDecoder;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.validation.annotation.Validated;
@ -71,7 +71,7 @@ import static org.springframework.web.testfixture.http.server.reactive.MockServe
*/
class MessageReaderArgumentResolverTests {
private AbstractMessageReaderArgumentResolver resolver = resolver(new Jackson2JsonDecoder());
private AbstractMessageReaderArgumentResolver resolver = resolver(new JacksonJsonDecoder());
private BindingContext bindingContext;

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -44,7 +44,7 @@ import org.springframework.http.MediaType;
import org.springframework.http.codec.EncoderHttpMessageWriter;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.http.codec.ResourceHttpMessageWriter;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.json.JacksonJsonEncoder;
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
import org.springframework.util.ObjectUtils;
import org.springframework.web.reactive.accept.RequestedContentTypeResolver;
@ -79,7 +79,7 @@ class MessageWriterResultHandlerTests {
writerList.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
writerList.add(new ResourceHttpMessageWriter());
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
writerList.add(new EncoderHttpMessageWriter<>(new JacksonJsonEncoder()));
}
else {
writerList = Arrays.asList(writers);

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -51,7 +51,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.json.JacksonJsonEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -497,7 +497,7 @@ class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMap
@GetMapping("/publisher")
@SuppressWarnings("deprecation")
Publisher<ByteBuffer> getPublisher() {
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
JacksonJsonEncoder encoder = new JacksonJsonEncoder();
return encoder.encode(Mono.just(new Person("Robert")), DefaultDataBufferFactory.sharedInstance,
ResolvableType.forClass(Person.class), JSON, Collections.emptyMap()).map(DataBuffer::toByteBuffer);
}

View File

@ -37,7 +37,7 @@ import org.springframework.http.ProblemDetail;
import org.springframework.http.codec.EncoderHttpMessageWriter;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.http.codec.ResourceHttpMessageWriter;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.json.JacksonJsonEncoder;
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
@ -76,7 +76,7 @@ class ResponseBodyResultHandlerTests {
writerList.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
writerList.add(new ResourceHttpMessageWriter());
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
writerList.add(new EncoderHttpMessageWriter<>(new JacksonJsonEncoder()));
RequestedContentTypeResolver resolver = new RequestedContentTypeResolverBuilder().build();
this.resultHandler = new ResponseBodyResultHandler(writerList, resolver);
}
@ -148,11 +148,13 @@ class ResponseBodyResultHandlerTests {
assertThat(exchange.getResponse().getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
assertThat(exchange.getResponse().getHeaders().getContentType()).isEqualTo(expectedMediaType);
assertResponseBody(exchange,
"{\"type\":\"about:blank\"," +
"\"title\":\"Bad Request\"," +
"\"status\":400," +
"\"instance\":\"/path\"}");
assertResponseBody(exchange,"""
{\
"status":400,\
"instance":"\\/path",\
"title":"Bad Request",\
"type":"about:blank"\
}""");
}
@Test

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -27,14 +27,15 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Single;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.SerializationFeature;
import tools.jackson.databind.json.JsonMapper;
import org.springframework.core.MethodParameter;
import org.springframework.core.ResolvableType;
@ -49,7 +50,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.http.codec.EncoderHttpMessageWriter;
import org.springframework.http.codec.HttpMessageWriter;
import org.springframework.http.codec.ResourceHttpMessageWriter;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.json.JacksonJsonEncoder;
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.web.ErrorResponse;
@ -90,7 +91,7 @@ class ResponseEntityResultHandlerTests {
new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()),
new ResourceHttpMessageWriter(),
new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()),
new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()),
new EncoderHttpMessageWriter<>(new JacksonJsonEncoder()),
new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
RequestedContentTypeResolver resolver = new RequestedContentTypeResolverBuilder().build();
return new ResponseEntityResultHandler(writerList, resolver);
@ -239,11 +240,13 @@ class ResponseEntityResultHandlerTests {
assertThat(exchange.getResponse().getHeaders().size()).isEqualTo(3);
assertThat(exchange.getResponse().getHeaders().get("foo")).containsExactly("bar");
assertThat(exchange.getResponse().getHeaders().getContentType()).isEqualTo(MediaType.APPLICATION_PROBLEM_JSON);
assertResponseBody(exchange,
"{\"type\":\"about:blank\"," +
"\"title\":\"Bad Request\"," +
"\"status\":400," +
"\"instance\":\"/path\"}");
assertResponseBody(exchange,"""
{\
"instance":"\\/path",\
"status":400,\
"title":"Bad Request",\
"type":"about:blank"\
}""");
}
@Test
@ -258,11 +261,13 @@ class ResponseEntityResultHandlerTests {
assertThat(exchange.getResponse().getStatusCode()).isEqualTo(HttpStatus.BAD_REQUEST);
assertThat(exchange.getResponse().getHeaders().size()).isEqualTo(2);
assertThat(exchange.getResponse().getHeaders().getContentType()).isEqualTo(MediaType.APPLICATION_PROBLEM_JSON);
assertResponseBody(exchange,
"{\"type\":\"about:blank\"," +
"\"title\":\"Bad Request\"," +
"\"status\":400," +
"\"instance\":\"/path\"}");
assertResponseBody(exchange,"""
{\
"instance":"\\/path",\
"status":400,\
"title":"Bad Request",\
"type":"about:blank"\
}""");
}
@Test
@ -436,10 +441,9 @@ class ResponseEntityResultHandlerTests {
MediaType halFormsMediaType = MediaType.parseMediaType("application/prs.hal-forms+json");
MediaType halMediaType = MediaType.parseMediaType("application/hal+json");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
ObjectMapper objectMapper = JsonMapper.builder().enable(SerializationFeature.INDENT_OUTPUT).build();
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
JacksonJsonEncoder encoder = new JacksonJsonEncoder();
encoder.registerObjectMappersForType(Person.class, map -> map.put(halMediaType, objectMapper));
EncoderHttpMessageWriter<?> writer = new EncoderHttpMessageWriter<>(encoder);

View File

@ -40,7 +40,6 @@ dependencies {
optional("org.reactivestreams:reactive-streams")
optional("org.webjars:webjars-locator-lite")
optional("tools.jackson.core:jackson-databind")
optional("tools.jackson.dataformat:jackson-dataformat-smile")
optional("tools.jackson.dataformat:jackson-dataformat-cbor")
optional("tools.jackson.dataformat:jackson-dataformat-smile")
optional("tools.jackson.dataformat:jackson-dataformat-xml")

View File

@ -30,6 +30,7 @@ import org.springframework.http.server.ServerHttpResponse;
/**
* A convenient base class for {@code ResponseBodyAdvice} implementations
* that customize the response before JSON serialization with
* {@link AbstractJacksonHttpMessageConverter}'s and
* {@link AbstractJackson2HttpMessageConverter}'s concrete subclasses.
*
* @author Rossen Stoyanchev

View File

@ -71,6 +71,9 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver;
*/
public abstract class AbstractMessageConverterMethodArgumentResolver implements HandlerMethodArgumentResolver {
protected enum ConverterType { BASE, GENERIC, SMART };
private static final Set<HttpMethod> SUPPORTED_METHODS = Set.of(HttpMethod.POST, HttpMethod.PUT, HttpMethod.PATCH);
private static final Object NO_VALUE = new Object();
@ -80,8 +83,6 @@ public abstract class AbstractMessageConverterMethodArgumentResolver implements
protected final List<HttpMessageConverter<?>> messageConverters;
protected enum ConverterType { BASE, GENERIC, SMART };
private final RequestResponseBodyAdviceChain advice;

View File

@ -19,7 +19,6 @@ package org.springframework.web.servlet.mvc.method.annotation;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
@ -93,29 +92,29 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
private static final List<MediaType> ALL_APPLICATION_MEDIA_TYPES =
List.of(MediaType.ALL, new MediaType("application"));
private static final List<MediaType> PROBLEM_MEDIA_TYPES =
List.of(MediaType.APPLICATION_PROBLEM_JSON, MediaType.APPLICATION_PROBLEM_XML);
private static final Type RESOURCE_REGION_LIST_TYPE =
new ParameterizedTypeReference<List<ResourceRegion>>() {}.getType();
private final ContentNegotiationManager contentNegotiationManager;
private final List<MediaType> problemMediaTypes =
Arrays.asList(MediaType.APPLICATION_PROBLEM_JSON, MediaType.APPLICATION_PROBLEM_XML);
private final List<ErrorResponse.Interceptor> errorResponseInterceptors = new ArrayList<>();
private final Set<String> safeExtensions = new HashSet<>();
/**
* Constructor with list of converters only.
* Construct with the provided list of converters only.
*/
protected AbstractMessageConverterMethodProcessor(List<HttpMessageConverter<?>> converters) {
this(converters, null, null);
}
/**
* Constructor with list of converters and ContentNegotiationManager.
* Construct with the provided list of converters and {@link ContentNegotiationManager}.
*/
protected AbstractMessageConverterMethodProcessor(List<HttpMessageConverter<?>> converters,
@Nullable ContentNegotiationManager contentNegotiationManager) {
@ -124,9 +123,8 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
}
/**
* Variant of {@link #AbstractMessageConverterMethodProcessor(List)}
* with an additional {@link ContentNegotiationManager} for return
* value handling.
* Variant of {@link #AbstractMessageConverterMethodProcessor(List, ContentNegotiationManager)}
* with an additional {@code requestResponseBodyAdvice} list for return value handling.
*/
protected AbstractMessageConverterMethodProcessor(List<HttpMessageConverter<?>> converters,
@Nullable ContentNegotiationManager manager, @Nullable List<Object> requestResponseBodyAdvice) {
@ -136,8 +134,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
/**
* Variant of {@link #AbstractMessageConverterMethodProcessor(List, ContentNegotiationManager, List)}
* with additional list of {@link ErrorResponse.Interceptor}s for return
* value handling.
* with additional list of {@link ErrorResponse.Interceptor}s for return value handling.
* @since 6.2
*/
protected AbstractMessageConverterMethodProcessor(List<HttpMessageConverter<?>> converters,
@ -154,7 +151,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
/**
* Creates a new {@link HttpOutputMessage} from the given {@link NativeWebRequest}.
* Create a new {@link HttpOutputMessage} from the given {@link NativeWebRequest}.
* @param webRequest the web request to create an output message from
* @return the output message
*/
@ -192,10 +189,10 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
}
/**
* Writes the given return type to the given output message.
* Write the given return type to the given output message.
* @param value the value to write to the output message
* @param returnType the type of the value
* @param inputMessage the input messages. Used to inspect the {@code Accept} header.
* @param inputMessage the input messages, used to inspect the {@code Accept} header
* @param outputMessage the output message to write to
* @throws IOException thrown in case of I/O errors
* @throws HttpMediaTypeNotAcceptableException thrown when the conditions indicated
@ -280,7 +277,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
// For ProblemDetail, fall back on RFC 9457 format
if (compatibleMediaTypes.isEmpty() && ProblemDetail.class.isAssignableFrom(valueType)) {
determineCompatibleMediaTypes(this.problemMediaTypes, producibleTypes, compatibleMediaTypes);
determineCompatibleMediaTypes(PROBLEM_MEDIA_TYPES, producibleTypes, compatibleMediaTypes);
}
if (compatibleMediaTypes.isEmpty()) {

View File

@ -90,4 +90,5 @@ public class JsonViewRequestBodyAdvice extends RequestBodyAdviceAdapter {
}
return classes[0];
}
}

View File

@ -79,4 +79,5 @@ public class JsonViewResponseBodyAdvice extends AbstractMappingJacksonResponseBo
}
return classes[0];
}
}

View File

@ -213,4 +213,5 @@ class RequestResponseBodyAdviceChain implements RequestBodyAdvice, ResponseBodyA
}
return hints;
}
}

View File

@ -61,7 +61,9 @@ public abstract class AbstractJacksonView extends AbstractView {
protected static final String FILTER_PROVIDER_HINT = FilterProvider.class.getName();
private static volatile @Nullable List<JacksonModule> modules = null;
private static volatile @Nullable List<JacksonModule> modules;
private final ObjectMapper objectMapper;
@ -84,6 +86,7 @@ public abstract class AbstractJacksonView extends AbstractView {
setExposePathVariables(false);
}
private List<JacksonModule> initModules() {
if (modules == null) {
modules = MapperBuilder.findModules(AbstractJacksonHttpMessageConverter.class.getClassLoader());
@ -94,7 +97,7 @@ public abstract class AbstractJacksonView extends AbstractView {
/**
* Set the {@code JsonEncoding} for this view.
* By default, {@linkplain JsonEncoding#UTF8 UTF-8} is used.
* <p>Default is {@linkplain JsonEncoding#UTF8 UTF-8}.
*/
public void setEncoding(JsonEncoding encoding) {
Assert.notNull(encoding, "'encoding' must not be null");
@ -110,7 +113,8 @@ public abstract class AbstractJacksonView extends AbstractView {
/**
* Disables caching of the generated JSON.
* <p>Default is {@code true}, which will prevent the client from caching the generated JSON.
* <p>Default is {@code true}, which will prevent the client from caching the
* generated JSON.
*/
public void setDisableCaching(boolean disableCaching) {
this.disableCaching = disableCaching;
@ -206,13 +210,13 @@ public abstract class AbstractJacksonView extends AbstractView {
/**
* Set the attribute in the model that should be rendered by this view.
* When set, all other model attributes will be ignored.
* <p>When set, all other model attributes will be ignored.
*/
public abstract void setModelKey(String modelKey);
/**
* Filter out undesired attributes from the given model.
* The return value can be either another {@link Map} or a single value object.
* <p>The return value can be either another {@link Map} or a single value object.
* @param model the model, as passed on to {@link #renderMergedOutputModel}
* @param request current HTTP request
* @return the value to be rendered
@ -221,16 +225,16 @@ public abstract class AbstractJacksonView extends AbstractView {
/**
* Write a prefix before the main content.
* @param generator the generator to use for writing content.
* @param object the object to write to the output message.
* @param generator the generator to use for writing content
* @param object the object to write to the output message
*/
protected void writePrefix(JsonGenerator generator, Object object) throws IOException {
}
/**
* Write a suffix after the main content.
* @param generator the generator to use for writing content.
* @param object the object to write to the output message.
* @param generator the generator to use for writing content
* @param object the object to write to the output message
*/
protected void writeSuffix(JsonGenerator generator, Object object) throws IOException {
}

View File

@ -55,11 +55,12 @@ import org.springframework.web.servlet.view.AbstractJacksonView;
public class JacksonJsonView extends AbstractJacksonView {
/**
* Default content type: "application/json".
* Overridable through {@link #setContentType}.
* Default content type: {@value}.
* <p>Overridable through {@link #setContentType(String)}.
*/
public static final String DEFAULT_CONTENT_TYPE = "application/json";
private @Nullable String jsonPrefix;
private @Nullable Set<String> modelKeys;
@ -79,7 +80,7 @@ public class JacksonJsonView extends AbstractJacksonView {
/**
* Construct a new instance using the provided {@link ObjectMapper}
* and setting the content type to {@code application/json}.
* and setting the content type to {@value #DEFAULT_CONTENT_TYPE}.
*/
public JacksonJsonView(ObjectMapper objectMapper) {
super(objectMapper, DEFAULT_CONTENT_TYPE);
@ -88,7 +89,7 @@ public class JacksonJsonView extends AbstractJacksonView {
/**
* Specify a custom prefix to use for this view's JSON output.
* Default is none.
* <p>Default is none.
* @see #setPrefixJson
*/
public void setJsonPrefix(String jsonPrefix) {
@ -97,7 +98,7 @@ public class JacksonJsonView extends AbstractJacksonView {
/**
* Indicates whether the JSON output by this view should be prefixed with <code>")]}', "</code>.
* Default is {@code false}.
* <p>Default is {@code false}.
* <p>Prefixing the JSON string in this manner is used to help prevent JSON Hijacking.
* The prefix renders the string syntactically invalid as a script so that it cannot be hijacked.
* This prefix should be stripped before parsing the string as JSON.
@ -114,7 +115,7 @@ public class JacksonJsonView extends AbstractJacksonView {
/**
* Set the attributes in the model that should be rendered by this view.
* When set, all other model attributes will be ignored.
* <p>When set, all other model attributes will be ignored.
*/
public void setModelKeys(@Nullable Set<String> modelKeys) {
this.modelKeys = modelKeys;
@ -141,7 +142,7 @@ public class JacksonJsonView extends AbstractJacksonView {
/**
* Filter out undesired attributes from the given model.
* The return value can be either another {@link Map} or a single value object.
* <p>The return value can be either another {@link Map} or a single value object.
* <p>The default implementation removes {@link BindingResult} instances and entries
* not included in the {@link #setModelKeys modelKeys} property.
* @param model the model, as passed on to {@link #renderMergedOutputModel}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -33,7 +33,7 @@ import org.springframework.web.servlet.view.AbstractJacksonView;
* using <a href="https://github.com/FasterXML/jackson">Jackson 3's</a> {@link XmlMapper}.
*
* <p>The Object to be serialized is supplied as a parameter in the model. The first serializable
* entry is used. Users can either specify a specific entry in the model via the
* entry is used. Users can specify a specific entry in the model via the
* {@link #setModelKey(String) sourceKey} property.
*
* <p>The following special model entries are supported:
@ -51,7 +51,8 @@ import org.springframework.web.servlet.view.AbstractJacksonView;
public class JacksonXmlView extends AbstractJacksonView {
/**
* The default content type for the view.
* Default content type: {@value}.
* <p>Overridable through {@link #setContentType(String)}.
*/
public static final String DEFAULT_CONTENT_TYPE = "application/xml";
@ -60,7 +61,7 @@ public class JacksonXmlView extends AbstractJacksonView {
/**
* Construct a new instance with a {@link XmlMapper} customized with
* Construct a new instance with an {@link XmlMapper} customized with
* the {@link tools.jackson.databind.JacksonModule}s found by
* {@link MapperBuilder#findModules(ClassLoader)} and setting
* the content type to {@code application/xml}.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -171,6 +171,7 @@ class ViewResolverRegistryTests {
}
@Test
@SuppressWarnings("removal")
void contentNegotiation() {
MappingJackson2JsonView view = new MappingJackson2JsonView();
this.registry.enableContentNegotiation(view);
@ -180,6 +181,7 @@ class ViewResolverRegistryTests {
}
@Test
@SuppressWarnings("removal")
void contentNegotiationAddsDefaultViewRegistrations() {
MappingJackson2JsonView view1 = new MappingJackson2JsonView();
this.registry.enableContentNegotiation(view1);

View File

@ -22,10 +22,12 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.databind.MapperFeature;
import tools.jackson.databind.ObjectMapper;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.testfixture.beans.TestBean;
@ -35,7 +37,7 @@ import org.springframework.format.FormatterRegistry;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.util.AntPathMatcher;
@ -79,13 +81,11 @@ import org.springframework.web.servlet.resource.ResourceUrlProviderExposingInter
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.ViewResolverComposite;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import org.springframework.web.servlet.view.json.JacksonJsonView;
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
import org.springframework.web.testfixture.servlet.MockServletContext;
import org.springframework.web.util.UrlPathHelper;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
import static com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.springframework.http.MediaType.APPLICATION_JSON;
@ -211,11 +211,11 @@ class WebMvcConfigurationSupportExtensionTests {
List<HttpMessageConverter<?>> converters = adapter.getMessageConverters();
assertThat(converters).hasSize(2);
assertThat(converters.get(0).getClass()).isEqualTo(StringHttpMessageConverter.class);
assertThat(converters.get(1).getClass()).isEqualTo(MappingJackson2HttpMessageConverter.class);
ObjectMapper objectMapper = ((MappingJackson2HttpMessageConverter) converters.get(1)).getObjectMapper();
assertThat(objectMapper.getDeserializationConfig().isEnabled(DEFAULT_VIEW_INCLUSION)).isFalse();
assertThat(objectMapper.getSerializationConfig().isEnabled(DEFAULT_VIEW_INCLUSION)).isFalse();
assertThat(objectMapper.getDeserializationConfig().isEnabled(FAIL_ON_UNKNOWN_PROPERTIES)).isFalse();
assertThat(converters.get(1).getClass()).isEqualTo(JacksonJsonHttpMessageConverter.class);
ObjectMapper objectMapper = ((JacksonJsonHttpMessageConverter) converters.get(1)).getObjectMapper();
assertThat(objectMapper.deserializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)).isFalse();
assertThat(objectMapper.deserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)).isFalse();
assertThat(objectMapper.serializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)).isFalse();
DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(adapter);
@ -313,7 +313,7 @@ class WebMvcConfigurationSupportExtensionTests {
List<View> defaultViews = (List<View>) accessor.getPropertyValue("defaultViews");
assertThat(defaultViews).isNotNull();
assertThat(defaultViews).hasSize(1);
assertThat(defaultViews.get(0).getClass()).isEqualTo(MappingJackson2JsonView.class);
assertThat(defaultViews.get(0).getClass()).isEqualTo(JacksonJsonView.class);
viewResolvers = (List<ViewResolver>) accessor.getPropertyValue("viewResolvers");
assertThat(viewResolvers).isNotNull();
@ -356,7 +356,7 @@ class WebMvcConfigurationSupportExtensionTests {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
}
@Override
@ -449,7 +449,7 @@ class WebMvcConfigurationSupportExtensionTests {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.enableContentNegotiation(new MappingJackson2JsonView());
registry.enableContentNegotiation(new JacksonJsonView());
registry.jsp("/", ".jsp");
}

View File

@ -21,10 +21,12 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import jakarta.servlet.http.HttpServletRequest;
import org.junit.jupiter.api.Test;
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.databind.MapperFeature;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.dataformat.xml.XmlMapper;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.context.ApplicationContext;
@ -43,9 +45,9 @@ import org.springframework.format.annotation.DateTimeFormat.ISO;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.AbstractJacksonHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.http.converter.xml.JacksonXmlHttpMessageConverter;
import org.springframework.stereotype.Controller;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
@ -93,8 +95,6 @@ import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
import org.springframework.web.testfixture.servlet.MockServletContext;
import org.springframework.web.util.UrlPathHelper;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
import static com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.web.servlet.DispatcherServlet.FLASH_MAP_MANAGER_BEAN_NAME;
import static org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME;
@ -174,14 +174,16 @@ class WebMvcConfigurationSupportTests {
List<HttpMessageConverter<?>> converters = adapter.getMessageConverters();
assertThat(converters).hasSizeGreaterThanOrEqualTo(13);
converters.stream()
.filter(AbstractJackson2HttpMessageConverter.class::isInstance)
.filter(AbstractJacksonHttpMessageConverter.class::isInstance)
.map(AbstractJacksonHttpMessageConverter.class::cast)
.forEach(converter -> {
ObjectMapper mapper = ((AbstractJackson2HttpMessageConverter) converter).getObjectMapper();
assertThat(mapper.getDeserializationConfig().isEnabled(DEFAULT_VIEW_INCLUSION)).isFalse();
assertThat(mapper.getSerializationConfig().isEnabled(DEFAULT_VIEW_INCLUSION)).isFalse();
assertThat(mapper.getDeserializationConfig().isEnabled(FAIL_ON_UNKNOWN_PROPERTIES)).isFalse();
if (converter instanceof MappingJackson2XmlHttpMessageConverter) {
assertThat(mapper.getClass()).isEqualTo(XmlMapper.class);
ObjectMapper mapper = converter.getObjectMapper();
assertThat(mapper.deserializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)).isFalse();
assertThat(mapper.deserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)).isFalse();
assertThat(mapper.serializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)).isFalse();
if (converter instanceof JacksonXmlHttpMessageConverter) {
assertThat(mapper).isExactlyInstanceOf(XmlMapper.class);
}
});

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -48,7 +48,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.validation.BindException;
@ -65,6 +65,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
/**
* Tests for {@link DefaultServerRequest}.
*
* @author Arjen Poutsma
*/
class DefaultServerRequestTests {
@ -305,7 +306,7 @@ class DefaultServerRequestTests {
servletRequest.setContent("[\"foo\",\"bar\"]".getBytes(UTF_8));
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
List.of(new MappingJackson2HttpMessageConverter()));
List.of(new JacksonJsonHttpMessageConverter()));
List<String> result = request.body(new ParameterizedTypeReference<>() {});
assertThat(result).containsExactly("foo", "bar");

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -38,7 +38,7 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.servlet.ModelAndView;
@ -294,7 +294,7 @@ class DefaultServerResponseBuilderTests {
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "https://example.com");
MockHttpServletResponse mockResponse = new MockHttpServletResponse();
ServerResponse.Context context = () -> Collections.singletonList(new MappingJackson2HttpMessageConverter());
ServerResponse.Context context = () -> Collections.singletonList(new JacksonJsonHttpMessageConverter());
ModelAndView mav = response.writeTo(mockRequest, mockResponse, context);
assertThat(mav).isNull();

View File

@ -20,11 +20,15 @@ import java.io.IOException;
import java.io.UncheckedIOException;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.SerializationFeature;
import tools.jackson.databind.json.JsonMapper;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
@ -33,23 +37,24 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ServerResponse.SseBuilder}.
*
* @author Arjen Poutsma
* @author Sebastien Deleuze
* @author Brian Clozel
*/
class SseServerResponseTests {
private MockHttpServletRequest mockRequest;
private final MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "https://example.com");
private final MockHttpServletResponse mockResponse = new MockHttpServletResponse();
private MockHttpServletResponse mockResponse;
@BeforeEach
void setUp() {
this.mockRequest = new MockHttpServletRequest("GET", "https://example.com");
this.mockRequest.setAsyncSupported(true);
this.mockResponse = new MockHttpServletResponse();
}
@Test
void sendString() throws Exception {
String body = "foo bar";
@ -83,7 +88,7 @@ class SseServerResponseTests {
}
});
ServerResponse.Context context = () -> Collections.singletonList(new MappingJackson2HttpMessageConverter());
ServerResponse.Context context = () -> List.of(new JacksonJsonHttpMessageConverter());
ModelAndView mav = response.writeTo(this.mockRequest, this.mockResponse, context);
assertThat(mav).isNull();
@ -104,9 +109,9 @@ class SseServerResponseTests {
}
});
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setPrettyPrint(true);
ServerResponse.Context context = () -> Collections.singletonList(converter);
ObjectMapper objectMapper = JsonMapper.builder().enable(SerializationFeature.INDENT_OUTPUT).build();
JacksonJsonHttpMessageConverter converter = new JacksonJsonHttpMessageConverter(objectMapper);
ServerResponse.Context context = () -> List.of(converter);
ModelAndView mav = response.writeTo(this.mockRequest, this.mockResponse, context);
assertThat(mav).isNull();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -20,13 +20,14 @@ import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.http.CacheControl;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
@ -35,21 +36,22 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link StreamingServerResponse}.
*
* @author Brian Clozel
*/
class StreamingServerResponseTests {
private MockHttpServletRequest mockRequest;
private final MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "https://example.com");
private final MockHttpServletResponse mockResponse = new MockHttpServletResponse();
private MockHttpServletResponse mockResponse;
@BeforeEach
void setUp() {
this.mockRequest = new MockHttpServletRequest("GET", "https://example.com");
this.mockRequest.setAsyncSupported(true);
this.mockResponse = new MockHttpServletResponse();
}
@Test
void writeSingleString() throws Exception {
String body = "data: foo bar\n\n";
@ -113,7 +115,7 @@ class StreamingServerResponseTests {
}
});
ServerResponse.Context context = () -> Collections.singletonList(new MappingJackson2HttpMessageConverter());
ServerResponse.Context context = () -> List.of(new JacksonJsonHttpMessageConverter());
ModelAndView mav = response.writeTo(this.mockRequest, this.mockResponse, context);
assertThat(mav).isNull();
assertThat(this.mockResponse.getContentType()).isEqualTo(MediaType.APPLICATION_NDJSON.toString());
@ -125,7 +127,6 @@ class StreamingServerResponseTests {
record Person(String name, int age) {
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -30,6 +30,7 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.core.MethodParameter;
@ -40,7 +41,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.RequestMapping;
@ -104,7 +105,7 @@ public class HttpEntityMethodProcessorTests {
this.servletRequest.setContentType("application/json");
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(converters);
@SuppressWarnings("unchecked")
@ -121,7 +122,7 @@ public class HttpEntityMethodProcessorTests {
this.servletRequest.setContentType("application/json");
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(converters);
HttpEntity<?> result = (HttpEntity<?>) processor.resolveArgument(this.paramSimpleBean,
@ -138,7 +139,7 @@ public class HttpEntityMethodProcessorTests {
this.servletRequest.setContentType("application/json");
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(converters);
@SuppressWarnings("unchecked")
@ -151,6 +152,7 @@ public class HttpEntityMethodProcessorTests {
}
@Test
@Disabled("Determine why this fails with JacksonJsonHttpMessageConverter but passes with MappingJackson2HttpMessageConverter")
void resolveArgumentTypeVariable() throws Exception {
Method method = MySimpleParameterizedController.class.getMethod("handleDto", HttpEntity.class);
HandlerMethod handlerMethod = new HandlerMethod(new MySimpleParameterizedController(), method);
@ -161,7 +163,7 @@ public class HttpEntityMethodProcessorTests {
this.servletRequest.setContentType(MediaType.APPLICATION_JSON_VALUE);
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(converters);
@SuppressWarnings("unchecked")
@ -179,7 +181,7 @@ public class HttpEntityMethodProcessorTests {
MethodParameter methodReturnType = handlerMethod.getReturnType();
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(converters);
Object returnValue = new JacksonController().handleList();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -263,6 +263,8 @@ class RequestMappingHandlerAdapterTests {
}
@Test // gh-15486
@SuppressWarnings("removal")
// TODO Migrate from MappingJackson2HttpMessageConverter and MappingJacksonValue to JacksonJsonHttpMessageConverter.
public void responseBodyAdvice() throws Exception {
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter());
@ -424,6 +426,7 @@ class RequestMappingHandlerAdapterTests {
extends AbstractMappingJacksonResponseBodyAdvice implements RequestBodyAdvice {
@Override
@SuppressWarnings("removal")
protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType,
MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -50,7 +50,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileSystemUtils;
@ -133,7 +133,7 @@ class RequestPartIntegrationTests {
converters.add(emptyBodyConverter);
converters.add(new ByteArrayHttpMessageConverter());
converters.add(new ResourceHttpMessageConverter());
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
AllEncompassingFormHttpMessageConverter converter = new AllEncompassingFormHttpMessageConverter();
converter.setPartConverters(converters);

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -95,7 +95,7 @@ import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
@ -1026,7 +1026,7 @@ class ServletAnnotationControllerHandlerMethodTests extends AbstractServletHandl
initDispatcherServlet(ResponseEntityController.class, usePathPatterns, wac -> {
RootBeanDefinition adapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
messageConverters.add(new MappingJackson2HttpMessageConverter());
messageConverters.add(new JacksonJsonHttpMessageConverter());
messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
adapterDef.getPropertyValues().add("messageConverters", messageConverters);
wac.registerBeanDefinition("handlerAdapter", adapterDef);
@ -1204,7 +1204,7 @@ class ServletAnnotationControllerHandlerMethodTests extends AbstractServletHandl
void produces(boolean usePathPatterns) throws Exception {
initDispatcherServlet(ProducesController.class, usePathPatterns, wac -> {
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
converters.add(new Jaxb2RootElementHttpMessageConverter());
RootBeanDefinition beanDef;

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -32,7 +32,7 @@ import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
@ -140,11 +140,13 @@ class ResourceHttpRequestHandlerIntegrationTests {
assertThat(response.getStatus()).isEqualTo(404);
assertThat(response.getContentType()).isEqualTo("application/problem+json");
assertThat(response.getContentAsString()).isEqualTo("""
{"type":"about:blank",\
"title":"Not Found",\
"status":404,\
{\
"detail":"No static resource non-existing.",\
"instance":"/cp/non-existing"}\
"instance":"\\/cp\\/non-existing",\
"status":404,\
"title":"Not Found",\
"type":"about:blank"\
}\
""");
}
@ -212,8 +214,9 @@ class ResourceHttpRequestHandlerIntegrationTests {
}
@Override
@SuppressWarnings("removal")
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new JacksonJsonHttpMessageConverter());
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -91,7 +91,7 @@ class JacksonJsonViewTests {
assertThat(response.getHeader("Cache-Control")).isEqualTo("no-store");
MediaType mediaType = MediaType.parseMediaType(response.getContentType());
assertThat(mediaType.isCompatibleWith(MediaType.parseMediaType(MappingJackson2JsonView.DEFAULT_CONTENT_TYPE))).isTrue();
assertThat(mediaType.isCompatibleWith(MediaType.parseMediaType(JacksonJsonView.DEFAULT_CONTENT_TYPE))).isTrue();
String jsonResult = response.getContentAsString();
assertThat(jsonResult).isNotEmpty();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -61,6 +61,7 @@ import static org.mockito.Mockito.mock;
* @author Sebastien Deleuze
* @author Sam Brannen
*/
@SuppressWarnings("removal")
class MappingJackson2JsonViewTests {
private MappingJackson2JsonView view = new MappingJackson2JsonView();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -83,7 +83,7 @@ class JacksonXmlViewTests {
assertThat(response.getHeader("Cache-Control")).isEqualTo("no-store");
MediaType mediaType = MediaType.parseMediaType(response.getContentType());
assertThat(mediaType.isCompatibleWith(MediaType.parseMediaType(MappingJackson2XmlView.DEFAULT_CONTENT_TYPE))).isTrue();
assertThat(mediaType.isCompatibleWith(MediaType.parseMediaType(JacksonXmlView.DEFAULT_CONTENT_TYPE))).isTrue();
String jsonResult = response.getContentAsString();
assertThat(jsonResult).isNotEmpty();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -52,6 +52,7 @@ import static org.mockito.Mockito.mock;
* @author Sebastien Deleuze
* @author Sam Brannen
*/
@SuppressWarnings("removal")
class MappingJackson2XmlViewTests {
private MappingJackson2XmlView view = new MappingJackson2XmlView();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -28,7 +28,6 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
class SockJsFrameTests {
@Test
void openFrame() {
SockJsFrame frame = SockJsFrame.openFrame();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.