Как изменить MediaType для MappingJacksonHttpMessageConverter в OAuth2RestTemplate - PullRequest
2 голосов
/ 24 марта 2012

У меня есть приложение, которое использует 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', который должен поддерживать */* типы контента, но не повезло.См. http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/http/MediaType.html

Другая важная информация заключается в том, что я сейчас использую всю конфигурацию XML.Я только что обновил наше приложение 2.5 до 3.1.1.Я использую OAuth2RestTemplate в фильтре PRE_AUTH с пружинной безопасностью, а не в контроллере.Поэтому я не использую аннотации для сопоставления остальных вызовов.Я пытался добавить <context:annotation-config/>, но это не имело значения.

Я просто вызываю мой компонент службы OAuth из моего пользовательского AbstractPreAuthenticatedProcessingFilter.Когда служебный компонент пытается выполнить вызов rest для пользовательских данных, выдается исключение, запускающее OAuth2ClientContextFilter, который пытается получить токен.Вот моя конфигурация служебного компонента OAuth2:

<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> 

Я что-то упустил?Почему Джексон не отображает ответ?

Ответы [ 2 ]

6 голосов
/ 28 марта 2012

Исправлена!Проблема заключалась в том, что 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 голосов
/ 01 июля 2015

Я пришел к этому вопросу, выполнив поиск " 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;
}
...