2012-03-24 65 views
2

我有一個應用程序使用Spring Source OAuth2作爲客戶端從資源服務器檢索用戶數據並創建本地用戶。我不斷收到錯誤當OAuth2ClientContextFilter嘗試檢索令牌:如何更改OAuth2RestTemplate中MappingJacksonHttpMessageConverter的MediaType

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是「應用/ 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安全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> 

我錯過了什麼嗎?傑克遜爲什麼不映射回應?

回答

5

固定!問題在於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; 
} 
+1

'傑克遜 - databind'是足夠我的設置。感謝提示! – skirsch 2016-02-22 11:30:40

+0

@skirsch感謝您的評論。 jackson-databind確實足夠。 – ozeray 2017-11-27 10:42:27

相關問題