基于 spring boot 1.5.x 的项目,使用 webmvc + security + oauth2。
集成 fastjson 前,使用缺省的 jackson,.../oauth/token 获取的响应中 token 名称是access_token: xxxxxxx,和 spring 文档一致。
集成 fastjson 后,.../oauth/token 获取的响应中 token 名称变成value: xxxxxxx,且其他字段名及格式均有变化,如果服务器发生异常,甚至会把 exception stack 全部返回,与 spring 文档不一致。
如何才能使spring oauth在使用 fastjson 和 jackson 时返回的 token 格式一致呢?
17条答案
按热度按时间n7taea2i1#
fastjson配置发出来,
错误的json和正确的也发出来。
q3aa05252#
# 集成 fastjson 的配置如下:
@configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
...
/**
*/
@OverRide
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(
SerializerFeature.DisableCircularReferenceDetect
);
converter.setFastJsonConfig(config);
converters.add(converter);
log.info("FastJSON enabled");
}
...
}
# /oauth/token 获取到的报文如下(其中 value 即是 access token):
{
"expiration": 1513752144897,
"expired": false,
"expiresIn": 604799,
"refreshToken": {
"expiration": 1515739344897,
"value": "dae50004-939c-40f2-98d8-4882374e08c7"
},
"scope": [
"api"
],
"tokenType": "bearer",
"value": "1e2c4181-01be-4aa1-8042-c2d2f74008d0"
}
# 而不集成 fastjson 时,获取到的报文如下:
{
"access_token": "d83156d4-cec3-4aa9-b9dc-78612ce3cd92",
"token_type": "bearer",
"refresh_token": "37d7638a-8ee2-4a74-8194-cf9673ab1689",
"expires_in": 604799,
"scope": "api"
}
多谢!
wh6knrhe3#
这个bug我也遇到了,目前是把FastJsonHttpMessageConverter去掉了。
mklgxw1f4#
请问这个问题解决了吗?
tktrz96b5#
You can Autowired
ObjectMapper
Just like this:
cidc1ykv6#
我跟你碰到的问题一样 请问你最后怎么解决的
olmpazwi7#
我也遇到了,这个问题怎么解决呢? 现在我是在每个spring boot项目的启动文件中单独设置。
wb1gzix08#
貌似还没解决,就因为这个,换回去用 jackson 了
tez616oj9#
我也遇到了,目前只能把FastJsonHttpMessageConverter先去掉
vyswwuz210#
可以考虑手动生成token流程,并在最后序列化的时候使用Jackson的ObjectMapper进行序列化并返回给客户端。(之前我的回复过于模糊,实在抱歉)
希望能够解决你们的问题
k4emjkb111#
我也碰到这类问题,最后通过fastjson 自定了一个SerializeFilter进行处理DefaultOAuth2AccessToken的序列化
FastJsonHttpMessageConverter中加入自定义的SerializeFilter
后面又发现FormOAuth2AccessTokenMessageConverter的实现,可以把这个加进去测试一下
nnt7mjpx12#
这个就太坑了 如果这样改 后续岂不是还有很多其他错误可能发生?有一套整体的解决方案不
iyfjxgzm13#
已经提供了解决方案,将FormOAuth2AccessTokenMessageConverter这个加入HttpMessageConverter中即可
nvbavucw14#
你好,可以详细讲一下。如何把这个FormOAuth2AccessTokenMessageConverter 加到 HttpMessageConverter中的方案吗?非常感谢
axr492tv15#
不好意思,当时我看错了,这段时间比较忙没看这个问题,你需要自行写个HttpMessageConverter来转换OAuth2AccessToken,fastjson本身也意识到这个问题,但是FormOAuth2AccessTokenMessageConverter这个类的writeInternal方法没有进行实现,你需要自行实现转换
加入MessageConverters
你可以参考
OAuth2AccessToken
这个序列化类OAuth2AccessTokenJackson2Serializer
进行编写相应的代码