@ -16,6 +16,7 @@
@@ -16,6 +16,7 @@
package org.springframework.boot.http.converter.autoconfigure ;
import java.io.IOException ;
import java.nio.charset.StandardCharsets ;
import java.util.ArrayList ;
import java.util.List ;
@ -52,11 +53,16 @@ import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguratio
@@ -52,11 +53,16 @@ import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguratio
import org.springframework.hateoas.RepresentationModel ;
import org.springframework.hateoas.mediatype.hal.forms.HalFormsHttpMessageConverter ;
import org.springframework.hateoas.server.mvc.TypeConstrainedJacksonJsonHttpMessageConverter ;
import org.springframework.http.HttpInputMessage ;
import org.springframework.http.HttpOutputMessage ;
import org.springframework.http.MediaType ;
import org.springframework.http.converter.AbstractHttpMessageConverter ;
import org.springframework.http.converter.HttpMessageConverter ;
import org.springframework.http.converter.HttpMessageConverters ;
import org.springframework.http.converter.HttpMessageConverters.ClientBuilder ;
import org.springframework.http.converter.HttpMessageConverters.ServerBuilder ;
import org.springframework.http.converter.HttpMessageNotReadableException ;
import org.springframework.http.converter.HttpMessageNotWritableException ;
import org.springframework.http.converter.StringHttpMessageConverter ;
import org.springframework.http.converter.json.GsonHttpMessageConverter ;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter ;
@ -103,6 +109,14 @@ class HttpMessageConvertersAutoConfigurationTests {
@@ -103,6 +109,14 @@ class HttpMessageConvertersAutoConfigurationTests {
} ) ;
}
@Test
void jacksonServerCustomizer ( ) {
this . contextRunner . withUserConfiguration ( CustomJsonConverterConfig . class ) . run ( ( context ) - > {
assertConverterIsNotRegistered ( context , JacksonJsonHttpMessageConverter . class ) ;
assertConverterIsRegistered ( context , CustomConverter . class ) ;
} ) ;
}
@Test
void jacksonConverterWithBuilder ( ) {
this . contextRunner . withUserConfiguration ( JacksonJsonMapperBuilderConfig . class ) . run ( ( context ) - > {
@ -455,16 +469,16 @@ class HttpMessageConvertersAutoConfigurationTests {
@@ -455,16 +469,16 @@ class HttpMessageConvertersAutoConfigurationTests {
private HttpMessageConverters getClientConverters ( ApplicationContext context ) {
ClientBuilder clientBuilder = HttpMessageConverters . forClient ( ) . registerDefaults ( ) ;
context . getBeansOfType ( ClientHttpMessageConvertersCustomizer . class )
. values ( )
context . getBeanProvider ( ClientHttpMessageConvertersCustomizer . class )
. orderedStream ( )
. forEach ( ( customizer ) - > customizer . customize ( clientBuilder ) ) ;
return clientBuilder . build ( ) ;
}
private HttpMessageConverters getServerConverters ( ApplicationContext context ) {
ServerBuilder serverBuilder = HttpMessageConverters . forServer ( ) . registerDefaults ( ) ;
context . getBeansOfType ( ServerHttpMessageConvertersCustomizer . class )
. values ( )
context . getBeanProvider ( ServerHttpMessageConvertersCustomizer . class )
. orderedStream ( )
. forEach ( ( customizer ) - > customizer . customize ( serverBuilder ) ) ;
return serverBuilder . build ( ) ;
}
@ -503,6 +517,26 @@ class HttpMessageConvertersAutoConfigurationTests {
@@ -503,6 +517,26 @@ class HttpMessageConvertersAutoConfigurationTests {
}
@Configuration ( proxyBeanMethods = false )
static class CustomJsonConverterConfig {
@Bean
JsonMapper jsonMapper ( ) {
return new JsonMapper ( ) ;
}
@Bean
ServerHttpMessageConvertersCustomizer jsonServerCustomizer ( ) {
return ( configurer ) - > configurer . withJsonConverter ( new CustomConverter ( MediaType . APPLICATION_JSON ) ) ;
}
@Bean
ClientHttpMessageConvertersCustomizer jsonClientCustomizer ( ) {
return ( configurer ) - > configurer . withJsonConverter ( new CustomConverter ( MediaType . APPLICATION_JSON ) ) ;
}
}
@Configuration ( proxyBeanMethods = false )
static class JacksonJsonMapperBuilderConfig {
@ -640,4 +674,30 @@ class HttpMessageConvertersAutoConfigurationTests {
@@ -640,4 +674,30 @@ class HttpMessageConvertersAutoConfigurationTests {
}
@SuppressWarnings ( "NullAway" )
static class CustomConverter extends AbstractHttpMessageConverter < Object > {
CustomConverter ( MediaType supportedMediaType ) {
super ( supportedMediaType ) ;
}
@Override
protected boolean supports ( Class < ? > clazz ) {
return true ;
}
@Override
protected Object readInternal ( Class < ? > clazz , HttpInputMessage inputMessage )
throws IOException , HttpMessageNotReadableException {
return null ;
}
@Override
protected void writeInternal ( Object o , HttpOutputMessage outputMessage )
throws IOException , HttpMessageNotWritableException {
}
}
}