【问题标题】:Could not read JSON: Current token (VALUE_STRING) not numeric, can not use numeric value accessors无法读取 JSON:当前令牌 (VALUE_STRING) 不是数字,不能使用数值访问器
【发布时间】:2017-05-31 05:01:32
【问题描述】:

我试图通过如下所示的 spring rest 模板获取 getAccessToken。我在调用 oAuthRestTemplate.getAccessToken()

时收到以下错误
Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token (VALUE_STRING) not numeric, can not use numeric value accessors

代码:

ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();

resource.setAccessTokenUri("https://../oauth2/token");
resource.setUsername("u");
resource.setPassword("p");
resource.setClientSecret("...s");
resource.setClientId("...i");
resource.setGrantType("password");
List<String> scopes = new ArrayList<String>(2);
scopes.add("write");
scopes.add("read");
resource.setScope(scopes);


DefaultOAuth2ClientContext clientContext = new DefaultOAuth2ClientContext();

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new MappingJackson2HttpMessageConverter());  
messageConverters.add(new FormHttpMessageConverter());
OAuth2RestTemplate oAuthRestTemplate =  new OAuth2RestTemplate(resource,clientContext);
oAuthRestTemplate.setMessageConverters(messageConverters);

try {
    SSLUtil.turnOffSslChecking();
    System.out.println(oAuthRestTemplate.getAccessToken());
    String result = oAuthRestTemplate.getForObject("url" + "/api/version", String.class);
} catch (RestClientException e) {
    e.printStackTrace();
}   

完整的错误跟踪:

Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token (VALUE_STRING) not numeric, can not use numeric value accessors
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@44908881; line: 1, column: 159]; nested exception is com.fasterxml.jackson.core.JsonParseException: Current token (VALUE_STRING) not numeric, can not use numeric value accessors
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@44908881; line: 1, column: 159]
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:171)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:163)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:94)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:491)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:454)
    at org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport.retrieveToken(OAuth2AccessTokenSupport.java:113)
    at org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider.obtainAccessToken(ResourceOwnerPasswordAccessTokenProvider.java:47)
    at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:142)
    at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainAccessToken(AccessTokenProviderChain.java:118)
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.acquireAccessToken(OAuth2RestTemplate.java:216)
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.getAccessToken(OAuth2RestTemplate.java:168)
    at com.ClientTemplate.main(ClientTemplate.java:69)
Caused by: com.fasterxml.jackson.core.JsonParseException: Current token (VALUE_STRING) not numeric, can not use numeric value accessors
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@44908881; line: 1, column: 159]
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1419)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:508)
    at com.fasterxml.jackson.core.base.ParserBase._parseNumericValue(ParserBase.java:748)
    at com.fasterxml.jackson.core.base.ParserBase.getLongValue(ParserBase.java:619)
    at org.springframework.security.oauth2.common.OAuth2AccessTokenJackson2Deserializer.deserialize(OAuth2AccessTokenJackson2Deserializer.java:75)
    at org.springframework.security.oauth2.common.OAuth2AccessTokenJackson2Deserializer.deserialize(OAuth2AccessTokenJackson2Deserializer.java:44)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2206)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:168)
    ... 11 more

在没有 messageConverters 的情况下尝试过。仍然是同样的错误。

【问题讨论】:

  • 你能发布回复吗?
  • 尝试得到响应 String result = oAuthRestTemplate.getForObject("url" + "/api/version", String.class); .. 但同样的错误。
  • 您是否尝试使用任何工具(浏览器、wget 等)调用 url 并检查纯响应?
  • 我在浏览器中得到了结果。但在程序 oAuthRestTemplate.getAccessToken() 本身失败
  • 请发表回复。

标签: java spring oauth-2.0 jackson resttemplate


【解决方案1】:

根据您的堆栈跟踪,我可以建议您使用 spring oauth 版本 1.0.1,该代码在第 75 行的 OAuth2AccessTokenJackson2Deserializer 中包含此代码:

...
else if (OAuth2AccessToken.EXPIRES_IN.equals(name)) {
    expiresIn = jp.getLongValue();
}
...

它期望字段expires_in 是数字。您的例外表明,在您的回复中,它实际上是 string

要解决此问题,您可以升级到最新版本(目前为 2.1.1),他们已修复此部分以接受字符串值:

....
else if (OAuth2AccessToken.EXPIRES_IN.equals(name)) {
    try {
        expiresIn = jp.getLongValue();
    } catch (JsonParseException e) {
        expiresIn = Long.valueOf(jp.getText());
    }
}
....

【讨论】:

  • 谢谢。有用。它生成令牌。但是,对于它抛出的响应 String resultCaused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'throw': was expecting 'null', 'true', 'false' or NaN
  • 对于我的输出响应,我在 json 开始之前有一条消息...比如throw abcd; { }
  • throw abcd; { } 不是有效的 JSON,因此它会为您提供 JsonParseException
  • 知道了。有些我怎样才能将其更改为文本而不是 json?
  • 我不熟悉 Oauth,我不明白你想通过这个 reposnse 实现什么,所以我没有建议,抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2021-03-04
  • 2023-03-22
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多