Skip to content

Commit 48990fd

Browse files
committed
Use SmartHttpMessageConverter over GenericHttpMessageConverter where possible
Closes: gh-18073 Signed-off-by: Andrey Litvitski <andrey1010102008@gmail.com>
1 parent fc795a8 commit 48990fd

File tree

18 files changed

+258
-85
lines changed

18 files changed

+258
-85
lines changed

config/src/main/java/org/springframework/security/config/web/server/HttpMessageConverters.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,27 @@
1616

1717
package org.springframework.security.config.web.server;
1818

19-
import org.springframework.http.converter.GenericHttpMessageConverter;
2019
import org.springframework.http.converter.HttpMessageConverter;
20+
import org.springframework.http.converter.SmartHttpMessageConverter;
2121
import org.springframework.http.converter.json.GsonHttpMessageConverter;
22+
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
2223
import org.springframework.http.converter.json.JsonbHttpMessageConverter;
2324
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
25+
import org.springframework.security.oauth2.core.SmartGenericHttpMessageConverterAdapter;
2426
import org.springframework.util.ClassUtils;
2527

2628
/**
2729
* Utility methods for {@link HttpMessageConverter}'s.
2830
*
2931
* @author Joe Grandja
3032
* @author luamas
33+
* @author Andrey Litvitski
3134
* @since 5.1
3235
*/
3336
final class HttpMessageConverters {
3437

38+
private static final boolean jackson3Present;
39+
3540
private static final boolean jackson2Present;
3641

3742
private static final boolean gsonPresent;
@@ -40,6 +45,8 @@ final class HttpMessageConverters {
4045

4146
static {
4247
ClassLoader classLoader = HttpMessageConverters.class.getClassLoader();
48+
jackson3Present = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader)
49+
&& ClassUtils.isPresent("tools.jackson.core.JsonGenerator", classLoader);
4350
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)
4451
&& ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
4552
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
@@ -49,15 +56,18 @@ final class HttpMessageConverters {
4956
private HttpMessageConverters() {
5057
}
5158

52-
static GenericHttpMessageConverter<Object> getJsonMessageConverter() {
59+
static SmartHttpMessageConverter<Object> getJsonMessageConverter() {
60+
if (jackson3Present) {
61+
return new JacksonJsonHttpMessageConverter();
62+
}
5363
if (jackson2Present) {
54-
return new MappingJackson2HttpMessageConverter();
64+
return new SmartGenericHttpMessageConverterAdapter<>(new MappingJackson2HttpMessageConverter());
5565
}
5666
if (gsonPresent) {
57-
return new GsonHttpMessageConverter();
67+
return new SmartGenericHttpMessageConverterAdapter<>(new GsonHttpMessageConverter());
5868
}
5969
if (jsonbPresent) {
60-
return new JsonbHttpMessageConverter();
70+
return new SmartGenericHttpMessageConverterAdapter<>(new JsonbHttpMessageConverter());
6171
}
6272
return null;
6373
}

oauth2/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/http/converter/HttpMessageConverters.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,27 @@
1616

1717
package org.springframework.security.oauth2.server.authorization.http.converter;
1818

19-
import org.springframework.http.converter.GenericHttpMessageConverter;
2019
import org.springframework.http.converter.HttpMessageConverter;
20+
import org.springframework.http.converter.SmartHttpMessageConverter;
2121
import org.springframework.http.converter.json.GsonHttpMessageConverter;
22+
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
2223
import org.springframework.http.converter.json.JsonbHttpMessageConverter;
2324
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
25+
import org.springframework.security.oauth2.core.SmartGenericHttpMessageConverterAdapter;
2426
import org.springframework.util.ClassUtils;
2527

2628
/**
2729
* Utility methods for {@link HttpMessageConverter}'s.
2830
*
2931
* @author Joe Grandja
3032
* @author l uamas
33+
* @author Andrey Litvitski
3134
* @since 7.0
3235
*/
3336
final class HttpMessageConverters {
3437

38+
private static final boolean jackson3Present;
39+
3540
private static final boolean jackson2Present;
3641

3742
private static final boolean gsonPresent;
@@ -40,6 +45,8 @@ final class HttpMessageConverters {
4045

4146
static {
4247
ClassLoader classLoader = HttpMessageConverters.class.getClassLoader();
48+
jackson3Present = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader)
49+
&& ClassUtils.isPresent("tools.jackson.core.JsonGenerator", classLoader);
4350
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)
4451
&& ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
4552
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
@@ -49,15 +56,18 @@ final class HttpMessageConverters {
4956
private HttpMessageConverters() {
5057
}
5158

52-
static GenericHttpMessageConverter<Object> getJsonMessageConverter() {
59+
static SmartHttpMessageConverter<Object> getJsonMessageConverter() {
60+
if (jackson3Present) {
61+
return new JacksonJsonHttpMessageConverter();
62+
}
5363
if (jackson2Present) {
54-
return new MappingJackson2HttpMessageConverter();
64+
return new SmartGenericHttpMessageConverterAdapter<>(new MappingJackson2HttpMessageConverter());
5565
}
5666
if (gsonPresent) {
57-
return new GsonHttpMessageConverter();
67+
return new SmartGenericHttpMessageConverterAdapter<>(new GsonHttpMessageConverter());
5868
}
5969
if (jsonbPresent) {
60-
return new JsonbHttpMessageConverter();
70+
return new SmartGenericHttpMessageConverterAdapter<>(new JsonbHttpMessageConverter());
6171
}
6272
return null;
6373
}

oauth2/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/http/converter/OAuth2AuthorizationServerMetadataHttpMessageConverter.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,17 @@
2222
import java.util.Map;
2323

2424
import org.springframework.core.ParameterizedTypeReference;
25+
import org.springframework.core.ResolvableType;
2526
import org.springframework.core.convert.TypeDescriptor;
2627
import org.springframework.core.convert.converter.Converter;
2728
import org.springframework.http.HttpInputMessage;
2829
import org.springframework.http.HttpOutputMessage;
2930
import org.springframework.http.MediaType;
3031
import org.springframework.http.converter.AbstractHttpMessageConverter;
31-
import org.springframework.http.converter.GenericHttpMessageConverter;
3232
import org.springframework.http.converter.HttpMessageConverter;
3333
import org.springframework.http.converter.HttpMessageNotReadableException;
3434
import org.springframework.http.converter.HttpMessageNotWritableException;
35+
import org.springframework.http.converter.SmartHttpMessageConverter;
3536
import org.springframework.security.oauth2.core.converter.ClaimConversionService;
3637
import org.springframework.security.oauth2.core.converter.ClaimTypeConverter;
3738
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata;
@@ -43,6 +44,7 @@
4344
* 2.0 Authorization Server Metadata Response}.
4445
*
4546
* @author Daniel Garnier-Moiroux
47+
* @author Andrey Livtitski
4648
* @since 7.0
4749
* @see AbstractHttpMessageConverter
4850
* @see OAuth2AuthorizationServerMetadata
@@ -53,7 +55,7 @@ public class OAuth2AuthorizationServerMetadataHttpMessageConverter
5355
private static final ParameterizedTypeReference<Map<String, Object>> STRING_OBJECT_MAP = new ParameterizedTypeReference<>() {
5456
};
5557

56-
private final GenericHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
58+
private final SmartHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
5759
.getJsonMessageConverter();
5860

5961
private Converter<Map<String, Object>, OAuth2AuthorizationServerMetadata> authorizationServerMetadataConverter = new OAuth2AuthorizationServerMetadataConverter();
@@ -74,8 +76,9 @@ protected boolean supports(Class<?> clazz) {
7476
protected OAuth2AuthorizationServerMetadata readInternal(Class<? extends OAuth2AuthorizationServerMetadata> clazz,
7577
HttpInputMessage inputMessage) throws HttpMessageNotReadableException {
7678
try {
79+
this.jsonMessageConverter.read(ResolvableType.forType(STRING_OBJECT_MAP.getType()), inputMessage, null);
7780
Map<String, Object> authorizationServerMetadataParameters = (Map<String, Object>) this.jsonMessageConverter
78-
.read(STRING_OBJECT_MAP.getType(), null, inputMessage);
81+
.read(ResolvableType.forType(STRING_OBJECT_MAP.getType()), inputMessage, null);
7982
return this.authorizationServerMetadataConverter.convert(authorizationServerMetadataParameters);
8083
}
8184
catch (Exception ex) {
@@ -91,8 +94,9 @@ protected void writeInternal(OAuth2AuthorizationServerMetadata authorizationServ
9194
try {
9295
Map<String, Object> authorizationServerMetadataResponseParameters = this.authorizationServerMetadataParametersConverter
9396
.convert(authorizationServerMetadata);
94-
this.jsonMessageConverter.write(authorizationServerMetadataResponseParameters, STRING_OBJECT_MAP.getType(),
95-
MediaType.APPLICATION_JSON, outputMessage);
97+
this.jsonMessageConverter.write(authorizationServerMetadataResponseParameters,
98+
ResolvableType.forType(STRING_OBJECT_MAP.getType()), MediaType.APPLICATION_JSON, outputMessage,
99+
null);
96100
}
97101
catch (Exception ex) {
98102
throw new HttpMessageNotWritableException(

oauth2/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/http/converter/OAuth2ClientRegistrationHttpMessageConverter.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,17 @@
2727
import java.util.Map;
2828

2929
import org.springframework.core.ParameterizedTypeReference;
30+
import org.springframework.core.ResolvableType;
3031
import org.springframework.core.convert.TypeDescriptor;
3132
import org.springframework.core.convert.converter.Converter;
3233
import org.springframework.http.HttpInputMessage;
3334
import org.springframework.http.HttpOutputMessage;
3435
import org.springframework.http.MediaType;
3536
import org.springframework.http.converter.AbstractHttpMessageConverter;
36-
import org.springframework.http.converter.GenericHttpMessageConverter;
3737
import org.springframework.http.converter.HttpMessageConverter;
3838
import org.springframework.http.converter.HttpMessageNotReadableException;
3939
import org.springframework.http.converter.HttpMessageNotWritableException;
40+
import org.springframework.http.converter.SmartHttpMessageConverter;
4041
import org.springframework.security.oauth2.core.converter.ClaimConversionService;
4142
import org.springframework.security.oauth2.core.converter.ClaimTypeConverter;
4243
import org.springframework.security.oauth2.server.authorization.OAuth2ClientMetadataClaimNames;
@@ -50,6 +51,7 @@
5051
* Client Registration Request and Response}.
5152
*
5253
* @author Joe Grandja
54+
* @author Andrey Litvitski
5355
* @since 7.0
5456
* @see AbstractHttpMessageConverter
5557
* @see OAuth2ClientRegistration
@@ -60,7 +62,7 @@ public class OAuth2ClientRegistrationHttpMessageConverter
6062
private static final ParameterizedTypeReference<Map<String, Object>> STRING_OBJECT_MAP = new ParameterizedTypeReference<>() {
6163
};
6264

63-
private final GenericHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
65+
private final SmartHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
6466
.getJsonMessageConverter();
6567

6668
private Converter<Map<String, Object>, OAuth2ClientRegistration> clientRegistrationConverter = new MapOAuth2ClientRegistrationConverter();
@@ -82,7 +84,7 @@ protected OAuth2ClientRegistration readInternal(Class<? extends OAuth2ClientRegi
8284
HttpInputMessage inputMessage) throws HttpMessageNotReadableException {
8385
try {
8486
Map<String, Object> clientRegistrationParameters = (Map<String, Object>) this.jsonMessageConverter
85-
.read(STRING_OBJECT_MAP.getType(), null, inputMessage);
87+
.read(ResolvableType.forType(STRING_OBJECT_MAP.getType()), inputMessage, null);
8688
return this.clientRegistrationConverter.convert(clientRegistrationParameters);
8789
}
8890
catch (Exception ex) {
@@ -98,8 +100,9 @@ protected void writeInternal(OAuth2ClientRegistration clientRegistration, HttpOu
98100
try {
99101
Map<String, Object> clientRegistrationParameters = this.clientRegistrationParametersConverter
100102
.convert(clientRegistration);
101-
this.jsonMessageConverter.write(clientRegistrationParameters, STRING_OBJECT_MAP.getType(),
102-
MediaType.APPLICATION_JSON, outputMessage);
103+
this.jsonMessageConverter.write(clientRegistrationParameters,
104+
ResolvableType.forType(STRING_OBJECT_MAP.getType()), MediaType.APPLICATION_JSON, outputMessage,
105+
null);
103106
}
104107
catch (Exception ex) {
105108
throw new HttpMessageNotWritableException(

oauth2/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/http/converter/OAuth2TokenIntrospectionHttpMessageConverter.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,17 @@
2727
import java.util.Map;
2828

2929
import org.springframework.core.ParameterizedTypeReference;
30+
import org.springframework.core.ResolvableType;
3031
import org.springframework.core.convert.TypeDescriptor;
3132
import org.springframework.core.convert.converter.Converter;
3233
import org.springframework.http.HttpInputMessage;
3334
import org.springframework.http.HttpOutputMessage;
3435
import org.springframework.http.MediaType;
3536
import org.springframework.http.converter.AbstractHttpMessageConverter;
36-
import org.springframework.http.converter.GenericHttpMessageConverter;
3737
import org.springframework.http.converter.HttpMessageConverter;
3838
import org.springframework.http.converter.HttpMessageNotReadableException;
3939
import org.springframework.http.converter.HttpMessageNotWritableException;
40+
import org.springframework.http.converter.SmartHttpMessageConverter;
4041
import org.springframework.security.oauth2.core.OAuth2TokenIntrospectionClaimNames;
4142
import org.springframework.security.oauth2.core.converter.ClaimConversionService;
4243
import org.springframework.security.oauth2.core.converter.ClaimTypeConverter;
@@ -51,6 +52,7 @@
5152
*
5253
* @author Gerardo Roza
5354
* @author Joe Grandja
55+
* @author Andrey Litvitski
5456
* @since 7.0
5557
* @see AbstractHttpMessageConverter
5658
* @see OAuth2TokenIntrospection
@@ -61,7 +63,7 @@ public class OAuth2TokenIntrospectionHttpMessageConverter
6163
private static final ParameterizedTypeReference<Map<String, Object>> STRING_OBJECT_MAP = new ParameterizedTypeReference<>() {
6264
};
6365

64-
private final GenericHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
66+
private final SmartHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
6567
.getJsonMessageConverter();
6668

6769
private Converter<Map<String, Object>, OAuth2TokenIntrospection> tokenIntrospectionConverter = new MapOAuth2TokenIntrospectionConverter();
@@ -83,7 +85,7 @@ protected OAuth2TokenIntrospection readInternal(Class<? extends OAuth2TokenIntro
8385
HttpInputMessage inputMessage) throws HttpMessageNotReadableException {
8486
try {
8587
Map<String, Object> tokenIntrospectionParameters = (Map<String, Object>) this.jsonMessageConverter
86-
.read(STRING_OBJECT_MAP.getType(), null, inputMessage);
88+
.read(ResolvableType.forType(STRING_OBJECT_MAP.getType()), inputMessage, null);
8789
return this.tokenIntrospectionConverter.convert(tokenIntrospectionParameters);
8890
}
8991
catch (Exception ex) {
@@ -98,8 +100,9 @@ protected void writeInternal(OAuth2TokenIntrospection tokenIntrospection, HttpOu
98100
try {
99101
Map<String, Object> tokenIntrospectionResponseParameters = this.tokenIntrospectionParametersConverter
100102
.convert(tokenIntrospection);
101-
this.jsonMessageConverter.write(tokenIntrospectionResponseParameters, STRING_OBJECT_MAP.getType(),
102-
MediaType.APPLICATION_JSON, outputMessage);
103+
this.jsonMessageConverter.write(tokenIntrospectionResponseParameters,
104+
ResolvableType.forType(STRING_OBJECT_MAP.getType()), MediaType.APPLICATION_JSON, outputMessage,
105+
null);
103106
}
104107
catch (Exception ex) {
105108
throw new HttpMessageNotWritableException(

oauth2/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/oidc/http/converter/HttpMessageConverters.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,27 @@
1616

1717
package org.springframework.security.oauth2.server.authorization.oidc.http.converter;
1818

19-
import org.springframework.http.converter.GenericHttpMessageConverter;
2019
import org.springframework.http.converter.HttpMessageConverter;
20+
import org.springframework.http.converter.SmartHttpMessageConverter;
2121
import org.springframework.http.converter.json.GsonHttpMessageConverter;
22+
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
2223
import org.springframework.http.converter.json.JsonbHttpMessageConverter;
2324
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
25+
import org.springframework.security.oauth2.core.SmartGenericHttpMessageConverterAdapter;
2426
import org.springframework.util.ClassUtils;
2527

2628
/**
2729
* Utility methods for {@link HttpMessageConverter}'s.
2830
*
2931
* @author Joe Grandja
3032
* @author l uamas
33+
* @author Andrey Litvitski
3134
* @since 7.0
3235
*/
3336
final class HttpMessageConverters {
3437

38+
private static final boolean jackson3Present;
39+
3540
private static final boolean jackson2Present;
3641

3742
private static final boolean gsonPresent;
@@ -40,6 +45,8 @@ final class HttpMessageConverters {
4045

4146
static {
4247
ClassLoader classLoader = HttpMessageConverters.class.getClassLoader();
48+
jackson3Present = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader)
49+
&& ClassUtils.isPresent("tools.jackson.core.JsonGenerator", classLoader);
4350
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)
4451
&& ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
4552
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
@@ -49,15 +56,18 @@ final class HttpMessageConverters {
4956
private HttpMessageConverters() {
5057
}
5158

52-
static GenericHttpMessageConverter<Object> getJsonMessageConverter() {
59+
static SmartHttpMessageConverter<Object> getJsonMessageConverter() {
60+
if (jackson3Present) {
61+
return new JacksonJsonHttpMessageConverter();
62+
}
5363
if (jackson2Present) {
54-
return new MappingJackson2HttpMessageConverter();
64+
return new SmartGenericHttpMessageConverterAdapter<>(new MappingJackson2HttpMessageConverter());
5565
}
5666
if (gsonPresent) {
57-
return new GsonHttpMessageConverter();
67+
return new SmartGenericHttpMessageConverterAdapter<>(new GsonHttpMessageConverter());
5868
}
5969
if (jsonbPresent) {
60-
return new JsonbHttpMessageConverter();
70+
return new SmartGenericHttpMessageConverterAdapter<>(new JsonbHttpMessageConverter());
6171
}
6272
return null;
6373
}

0 commit comments

Comments
 (0)