1

我正在尝试使用基于插件grails-spring-security-oauth2-provider 的grails 配置广告 OAUTH2 提供程序,但已升级到pring-Security-OAuth M6

我能够使用 /oauth/authorize 端点注册客户端并获取授权码。

但是当我尝试获取访问令牌时出现问题,它似乎无法返回 json。

我用 curl 调用访问令牌端点

curl -k -i -H "Accept: application/json" "https://graph.mysite.it/oauth/token?client_id=testApp&client_secret=testAppSecret&response_type=token&grant_typization_code&code=OJD7xf&redirect_uri=https%3A%2F%2Fgraph.mysiste.it%2Fxme"

并且服务器回复 HttpMediaTypeNotAcceptableException 找不到可接受的表示。

在google上搜索我尝试添加resources.xml mvc:annotation-driven让spring注册json jackson转换器,此时调用返回HTTP/1.1 406 Not Acceptable“此请求标识的资源只能生成响应根据请求“接受”标头具有不可接受的特征

进入 spring security oauth source 我到达了这个控制器TokenEndpoint.java 在这里调试我看到令牌被正确生成。使用 groovy 控制台,我尝试手动收集杰克逊转换器广告,它起作用了:

   import org.codehaus.jackson.map.ObjectMapper
   import org.springframework.security.oauth2.common.OAuth2AccessToken
   def mapper = new ObjectMapper()
   def token = new OAuth2AccessToken('fdkshdlfhklsahdklfhksaldfkl')
   mapper.writeValueAsString(token)

json 打印正确,所以我可以排除杰克逊配置中的问题。

spring mvc 控制器在 grails 中映射为

"/oauth/token"(uri:"/oauth/token.dispatch")

问题出在哪里?为什么grails不能返回json?

这是我的依赖报告

4

2 回答 2

1

我遇到了同样的问题,但是以这种方式在 resource.groovy 中声明了 annotationHandlerAdapter 配置并且它可以工作:

import org.springframework.http.converter.ByteArrayHttpMessageConverter
import org.springframework.http.converter.FormHttpMessageConverter
import org.springframework.http.converter.StringHttpMessageConverter
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
import org.springframework.http.converter.xml.SourceHttpMessageConverter
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

beans = {
    annotationHandlerAdapter(RequestMappingHandlerAdapter){
        messageConverters = [
                new StringHttpMessageConverter(writeAcceptCharset: false),
                new ByteArrayHttpMessageConverter(),
                new FormHttpMessageConverter(),
                new SourceHttpMessageConverter(),
                new MappingJacksonHttpMessageConverter()
        ]
    }

}
于 2013-02-14T00:01:23.283 回答
0

解决了。

在 Spring 中,转换器在 bean RequestMappingHandlerAdapter 中声明,该 bean RequestMappingHandlerAdapter 在文件 ControllersGrailsPlugin 中的 grails 核心中配置。

在 resource.xml 中声明无效。

为了添加转换器,我在我的 grails 插件的 doWithSpring 方法中重新定义了 bean

import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
import org.springframework.http.converter.StringHttpMessageConverter
import org.springframework.http.converter.ByteArrayHttpMessageConverter
import org.springframework.http.converter.FormHttpMessageConverter
import org.springframework.http.converter.xml.SourceHttpMessageConverter
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter


class MyGrailsPlugin {

def doWithSpring = {
annotationHandlerAdapter(RequestMappingHandlerAdapter){
            messageConverters = [
                new StringHttpMessageConverter(writeAcceptCharset: false),
                new ByteArrayHttpMessageConverter(),
                new FormHttpMessageConverter(),
                new SourceHttpMessageConverter(),
                new MappingJacksonHttpMessageConverter()
                ]
            }

}

}
于 2012-06-12T14:44:45.687 回答