Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,27 @@

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

import org.springframework.http.converter.GenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.SmartHttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.http.converter.json.JsonbHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.security.oauth2.core.SmartGenericHttpMessageConverterAdapter;
import org.springframework.util.ClassUtils;

/**
* Utility methods for {@link HttpMessageConverter}'s.
*
* @author Joe Grandja
* @author luamas
* @author Andrey Litvitski
* @since 5.1
*/
final class HttpMessageConverters {

private static final boolean jackson3Present;

private static final boolean jackson2Present;

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

static {
ClassLoader classLoader = HttpMessageConverters.class.getClassLoader();
jackson3Present = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader)
&& ClassUtils.isPresent("tools.jackson.core.JsonGenerator", classLoader);
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)
&& ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
Expand All @@ -49,15 +56,18 @@ final class HttpMessageConverters {
private HttpMessageConverters() {
}

static GenericHttpMessageConverter<Object> getJsonMessageConverter() {
static SmartHttpMessageConverter<Object> getJsonMessageConverter() {
if (jackson3Present) {
return new JacksonJsonHttpMessageConverter();
}
if (jackson2Present) {
return new MappingJackson2HttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new MappingJackson2HttpMessageConverter());
}
if (gsonPresent) {
return new GsonHttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new GsonHttpMessageConverter());
}
if (jsonbPresent) {
return new JsonbHttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new JsonbHttpMessageConverter());
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,27 @@

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

import org.springframework.http.converter.GenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.SmartHttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.http.converter.json.JsonbHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.security.oauth2.core.SmartGenericHttpMessageConverterAdapter;
import org.springframework.util.ClassUtils;

/**
* Utility methods for {@link HttpMessageConverter}'s.
*
* @author Joe Grandja
* @author l uamas
* @author Andrey Litvitski
* @since 7.0
*/
final class HttpMessageConverters {

private static final boolean jackson3Present;

private static final boolean jackson2Present;

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

static {
ClassLoader classLoader = HttpMessageConverters.class.getClassLoader();
jackson3Present = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader)
&& ClassUtils.isPresent("tools.jackson.core.JsonGenerator", classLoader);
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)
&& ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
Expand All @@ -49,15 +56,18 @@ final class HttpMessageConverters {
private HttpMessageConverters() {
}

static GenericHttpMessageConverter<Object> getJsonMessageConverter() {
static SmartHttpMessageConverter<Object> getJsonMessageConverter() {
if (jackson3Present) {
return new JacksonJsonHttpMessageConverter();
}
if (jackson2Present) {
return new MappingJackson2HttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new MappingJackson2HttpMessageConverter());
}
if (gsonPresent) {
return new GsonHttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new GsonHttpMessageConverter());
}
if (jsonbPresent) {
return new JsonbHttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new JsonbHttpMessageConverter());
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,17 @@
import java.util.Map;

import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.ResolvableType;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.Converter;
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.GenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.SmartHttpMessageConverter;
import org.springframework.security.oauth2.core.converter.ClaimConversionService;
import org.springframework.security.oauth2.core.converter.ClaimTypeConverter;
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata;
Expand All @@ -43,6 +44,7 @@
* 2.0 Authorization Server Metadata Response}.
*
* @author Daniel Garnier-Moiroux
* @author Andrey Livtitski
* @since 7.0
* @see AbstractHttpMessageConverter
* @see OAuth2AuthorizationServerMetadata
Expand All @@ -53,7 +55,7 @@ public class OAuth2AuthorizationServerMetadataHttpMessageConverter
private static final ParameterizedTypeReference<Map<String, Object>> STRING_OBJECT_MAP = new ParameterizedTypeReference<>() {
};

private final GenericHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
private final SmartHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
.getJsonMessageConverter();

private Converter<Map<String, Object>, OAuth2AuthorizationServerMetadata> authorizationServerMetadataConverter = new OAuth2AuthorizationServerMetadataConverter();
Expand All @@ -75,7 +77,7 @@ protected OAuth2AuthorizationServerMetadata readInternal(Class<? extends OAuth2A
HttpInputMessage inputMessage) throws HttpMessageNotReadableException {
try {
Map<String, Object> authorizationServerMetadataParameters = (Map<String, Object>) this.jsonMessageConverter
.read(STRING_OBJECT_MAP.getType(), null, inputMessage);
.read(ResolvableType.forType(STRING_OBJECT_MAP.getType()), inputMessage, null);
return this.authorizationServerMetadataConverter.convert(authorizationServerMetadataParameters);
}
catch (Exception ex) {
Expand All @@ -91,8 +93,9 @@ protected void writeInternal(OAuth2AuthorizationServerMetadata authorizationServ
try {
Map<String, Object> authorizationServerMetadataResponseParameters = this.authorizationServerMetadataParametersConverter
.convert(authorizationServerMetadata);
this.jsonMessageConverter.write(authorizationServerMetadataResponseParameters, STRING_OBJECT_MAP.getType(),
MediaType.APPLICATION_JSON, outputMessage);
this.jsonMessageConverter.write(authorizationServerMetadataResponseParameters,
ResolvableType.forType(STRING_OBJECT_MAP.getType()), MediaType.APPLICATION_JSON, outputMessage,
null);
}
catch (Exception ex) {
throw new HttpMessageNotWritableException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,17 @@
import java.util.Map;

import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.ResolvableType;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.Converter;
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.GenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.SmartHttpMessageConverter;
import org.springframework.security.oauth2.core.converter.ClaimConversionService;
import org.springframework.security.oauth2.core.converter.ClaimTypeConverter;
import org.springframework.security.oauth2.server.authorization.OAuth2ClientMetadataClaimNames;
Expand All @@ -50,6 +51,7 @@
* Client Registration Request and Response}.
*
* @author Joe Grandja
* @author Andrey Litvitski
* @since 7.0
* @see AbstractHttpMessageConverter
* @see OAuth2ClientRegistration
Expand All @@ -60,7 +62,7 @@ public class OAuth2ClientRegistrationHttpMessageConverter
private static final ParameterizedTypeReference<Map<String, Object>> STRING_OBJECT_MAP = new ParameterizedTypeReference<>() {
};

private final GenericHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
private final SmartHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
.getJsonMessageConverter();

private Converter<Map<String, Object>, OAuth2ClientRegistration> clientRegistrationConverter = new MapOAuth2ClientRegistrationConverter();
Expand All @@ -82,7 +84,7 @@ protected OAuth2ClientRegistration readInternal(Class<? extends OAuth2ClientRegi
HttpInputMessage inputMessage) throws HttpMessageNotReadableException {
try {
Map<String, Object> clientRegistrationParameters = (Map<String, Object>) this.jsonMessageConverter
.read(STRING_OBJECT_MAP.getType(), null, inputMessage);
.read(ResolvableType.forType(STRING_OBJECT_MAP.getType()), inputMessage, null);
return this.clientRegistrationConverter.convert(clientRegistrationParameters);
}
catch (Exception ex) {
Expand All @@ -98,8 +100,9 @@ protected void writeInternal(OAuth2ClientRegistration clientRegistration, HttpOu
try {
Map<String, Object> clientRegistrationParameters = this.clientRegistrationParametersConverter
.convert(clientRegistration);
this.jsonMessageConverter.write(clientRegistrationParameters, STRING_OBJECT_MAP.getType(),
MediaType.APPLICATION_JSON, outputMessage);
this.jsonMessageConverter.write(clientRegistrationParameters,
ResolvableType.forType(STRING_OBJECT_MAP.getType()), MediaType.APPLICATION_JSON, outputMessage,
null);
}
catch (Exception ex) {
throw new HttpMessageNotWritableException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,17 @@
import java.util.Map;

import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.ResolvableType;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.Converter;
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.GenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.SmartHttpMessageConverter;
import org.springframework.security.oauth2.core.OAuth2TokenIntrospectionClaimNames;
import org.springframework.security.oauth2.core.converter.ClaimConversionService;
import org.springframework.security.oauth2.core.converter.ClaimTypeConverter;
Expand All @@ -51,6 +52,7 @@
*
* @author Gerardo Roza
* @author Joe Grandja
* @author Andrey Litvitski
* @since 7.0
* @see AbstractHttpMessageConverter
* @see OAuth2TokenIntrospection
Expand All @@ -61,7 +63,7 @@ public class OAuth2TokenIntrospectionHttpMessageConverter
private static final ParameterizedTypeReference<Map<String, Object>> STRING_OBJECT_MAP = new ParameterizedTypeReference<>() {
};

private final GenericHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
private final SmartHttpMessageConverter<Object> jsonMessageConverter = HttpMessageConverters
.getJsonMessageConverter();

private Converter<Map<String, Object>, OAuth2TokenIntrospection> tokenIntrospectionConverter = new MapOAuth2TokenIntrospectionConverter();
Expand All @@ -83,7 +85,7 @@ protected OAuth2TokenIntrospection readInternal(Class<? extends OAuth2TokenIntro
HttpInputMessage inputMessage) throws HttpMessageNotReadableException {
try {
Map<String, Object> tokenIntrospectionParameters = (Map<String, Object>) this.jsonMessageConverter
.read(STRING_OBJECT_MAP.getType(), null, inputMessage);
.read(ResolvableType.forType(STRING_OBJECT_MAP.getType()), inputMessage, null);
return this.tokenIntrospectionConverter.convert(tokenIntrospectionParameters);
}
catch (Exception ex) {
Expand All @@ -98,8 +100,9 @@ protected void writeInternal(OAuth2TokenIntrospection tokenIntrospection, HttpOu
try {
Map<String, Object> tokenIntrospectionResponseParameters = this.tokenIntrospectionParametersConverter
.convert(tokenIntrospection);
this.jsonMessageConverter.write(tokenIntrospectionResponseParameters, STRING_OBJECT_MAP.getType(),
MediaType.APPLICATION_JSON, outputMessage);
this.jsonMessageConverter.write(tokenIntrospectionResponseParameters,
ResolvableType.forType(STRING_OBJECT_MAP.getType()), MediaType.APPLICATION_JSON, outputMessage,
null);
}
catch (Exception ex) {
throw new HttpMessageNotWritableException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,27 @@

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

import org.springframework.http.converter.GenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.SmartHttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
import org.springframework.http.converter.json.JsonbHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.security.oauth2.core.SmartGenericHttpMessageConverterAdapter;
import org.springframework.util.ClassUtils;

/**
* Utility methods for {@link HttpMessageConverter}'s.
*
* @author Joe Grandja
* @author l uamas
* @author Andrey Litvitski
* @since 7.0
*/
final class HttpMessageConverters {

private static final boolean jackson3Present;

private static final boolean jackson2Present;

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

static {
ClassLoader classLoader = HttpMessageConverters.class.getClassLoader();
jackson3Present = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader)
&& ClassUtils.isPresent("tools.jackson.core.JsonGenerator", classLoader);
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)
&& ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
Expand All @@ -49,15 +56,18 @@ final class HttpMessageConverters {
private HttpMessageConverters() {
}

static GenericHttpMessageConverter<Object> getJsonMessageConverter() {
static SmartHttpMessageConverter<Object> getJsonMessageConverter() {
if (jackson3Present) {
return new JacksonJsonHttpMessageConverter();
}
if (jackson2Present) {
return new MappingJackson2HttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new MappingJackson2HttpMessageConverter());
}
if (gsonPresent) {
return new GsonHttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new GsonHttpMessageConverter());
}
if (jsonbPresent) {
return new JsonbHttpMessageConverter();
return new SmartGenericHttpMessageConverterAdapter<>(new JsonbHttpMessageConverter());
}
return null;
}
Expand Down
Loading