我有一个应用程序使用Spring Source OAuth2作为客户端从资源服务器检索用户数据并创建本地用户。当OAuth2ClientContextFilter尝试检索令牌时,我不断收到错误:
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [org.springframework.security.oauth2.common.OAuth2AccessToken] and content type [application/x-javascript;charset=utf-8]
我理解默认的MediaType是'application / json',所以我尝试像这样自定义MappingJacksonHttpMessageConverter:
<bean id="jacksonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<bean class="org.springframework.http.MediaType">
<constructor-arg value="application"/>
<constructor-arg value="x-javascript"/>
<constructor-arg value="UTF-8"/>
</bean>
</list>
</property>
</bean>
我还尝试了'ALL'构造函数arg,它应该支持*/*
内容类型,但没有运气。见http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/http/MediaType.html
其他重要信息是我现在正在使用全XML配置。我刚刚将2.5应用程序升级到3.1.1。我在spring security PRE_AUTH过滤器中使用OAuth2RestTemplate,而不是在控制器中。所以我没有使用注释来映射其余的调用。我尝试添加<context:annotation-config/>
,但这没有任何区别。
我只是从我的自定义AbstractPreAuthenticatedProcessingFilter调用我的OAuth服务bean。当服务bean尝试执行对用户数据的其余调用时,将引发异常,触发尝试检索令牌的OAuth2ClientContextFilter。这是我的OAuth2服务bean配置:
<bean id="reprintsOauthService" class="com.coral.user.ReprintsOauthService">
<property name="reprintsUserInfoUrl" value="https://www.demo.com/api/userinfo.ashx" />
<property name="reprintsRestTemplate">
<bean class="org.springframework.security.oauth2.client.OAuth2RestTemplate">
<constructor-arg ref="reprintsResource"/>
<property name="messageConverters">
<list>
<ref bean="jacksonConverter"/>
</list>
</property>
</bean>
</property>
</bean>
我错过了什么吗?杰克逊为什么不映射回应?
答案 0 :(得分:6)
固定!问题是OAuth2RestTemplate不用于令牌检索。所以我必须自定义org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport并将MappingJacksonHttpMessageConverter添加到现有方法中,如下所示:
public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
this.messageConverters = new ArrayList<HttpMessageConverter<?>>(messageConverters);
this.messageConverters.add(new FormOAuth2AccessTokenMessageConverter());
this.messageConverters.add(new FormOAuth2ExceptionHttpMessageConverter());
MappingJacksonHttpMessageConverter jackson = new MappingJacksonHttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(new MediaType("application", "x-javascript"));
jackson.setSupportedMediaTypes(mediaTypes);
this.messageConverters.add(jackson);
if(logger.isDebugEnabled())
{
logger.debug("*** Added custom media type 'application/x-javascript' to the Jackson converter");
}
}
答案 1 :(得分:2)
我通过搜索“ oauth RestClientException来解决这个问题:无法提取响应:没有为响应类型找到合适的HttpMessageConverter ”
你的回答是我需要解决问题的暗示!我添加了以下 Maven 依赖项(在oauth2 pom中是可选的):
<!-- spring oauth2 json dependency: -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.2</version>
</dependency>
创建 AuthorizationCodeAccessTokenProvider 时,我添加了jackson消息转换器:
protected AuthorizationCodeAccessTokenProvider getAccessTokenProvider() {
final AuthorizationCodeAccessTokenProvider oAuthProvider = new AuthorizationCodeAccessTokenProvider();
final List<HttpMessageConverter<?>> messageConv = new ArrayList<HttpMessageConverter<?>>();
messageConv.add(new MappingJackson2HttpMessageConverter());
oAuthProvider.setMessageConverters(messageConv);
return oAuthProvider;
}