我有一个使用Spring Source OAuth2作为s客户端的应用程序,以从资源服务器检索用户数据并创建本地用户。当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。我在春季安全性PRE_AUTH过滤器中而不是在控制器中使用OAuth2RestTemplate。因此,我没有使用注释来映射其余的调用。我尝试添加<context:annotation-config/>,但这没有什么不同。

我只是从自定义AbstractPreAuthenticatedProcessingFilter调用OAuth服务bean。当服务bean尝试执行对用户数据的rest调用时,将引发异常,从而触发OAuth2ClientContextFilter,该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>


我想念什么吗?为什么Jackson不映射响应?

最佳答案

固定!问题是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");
    }
}

关于spring-security - 如何在OAuth2RestTemplate中更改MappingJacksonHttpMessageConverter的MediaType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9854855/

10-12 22:37