【问题标题】:How to change MediaType for MappingJacksonHttpMessageConverter in OAuth2RestTemplate如何在 OAuth2RestTemplate 中更改 MappingJacksonHttpMessageConverter 的 MediaType
【发布时间】:2012-04-08 22:29:28
【问题描述】:

我有一个应用程序使用 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。我在弹簧安全 PRE_AUTH 过滤器中使用 OAuth2RestTemplate,而不是在控制器中。所以我没有使用注释来映射其余的调用。我试过添加&lt;context:annotation-config/&gt;,但这并没有什么不同。

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

我错过了什么吗?为什么杰克逊不映射响应?

【问题讨论】:

    标签: spring-security oauth-2.0 jackson resttemplate


    【解决方案1】:

    已修复!问题是 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");
        }
    }
    

    【讨论】:

      【解决方案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 时,我添加了杰克逊消息转换器:

      protected AuthorizationCodeAccessTokenProvider getAccessTokenProvider() {
          final AuthorizationCodeAccessTokenProvider oAuthProvider = new AuthorizationCodeAccessTokenProvider();
          final List<HttpMessageConverter<?>> messageConv = new ArrayList<HttpMessageConverter<?>>();
          messageConv.add(new MappingJackson2HttpMessageConverter());
          oAuthProvider.setMessageConverters(messageConv);
          return oAuthProvider;
      }
      

      【讨论】:

      • jackson-databind 足以满足我的设置。感谢您的提示!
      • @skirsch 感谢您的评论。 jackson-databind 确实足够了。
      猜你喜欢
      • 2014-12-22
      • 2013-01-17
      • 2016-06-09
      • 2011-08-09
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      相关资源
      最近更新 更多