【问题标题】:Jackson parse exception while using Guava's RateLimiterJackson 在使用 Guava 的 RateLimiter 时解析异常
【发布时间】:2017-09-07 12:20:54
【问题描述】:

我正在使用 Guava 的 RateLimiter,因此我不会在 API 上达到每秒的最大请求数(我是 5..)。它工作正常,我现在从来没有达到速率限制,但我现在有一个奇怪的问题。出于某种原因,它在运行应用程序的 5 次中有 1 次出现 6 次调用之一的异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.fasterxml.jackson.databind.JavaType.equals(java.lang.Object)' on a null object reference
                                               at com.fasterxml.jackson.databind.type.ResolvedRecursiveType.equals(ResolvedRecursiveType.java:103)
                                               at com.fasterxml.jackson.databind.type.TypeBindings$AsKey.equals(TypeBindings.java:458)
                                               at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1014)
                                               at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1522)
                                               at com.fasterxml.jackson.databind.util.LRUMap.putIfAbsent(LRUMap.java:64)
                                               at com.fasterxml.jackson.databind.type.TypeFactory._fromClass(TypeFactory.java:1274)
                                               at com.fasterxml.jackson.databind.type.TypeFactory._fromParamType(TypeFactory.java:1384)
                                               at com.fasterxml.jackson.databind.type.TypeFactory._fromAny(TypeFactory.java:1154)
                                               at com.fasterxml.jackson.databind.type.TypeFactory._resolveSuperInterfaces(TypeFactory.java:1298)
                                               at com.fasterxml.jackson.databind.type.TypeFactory._fromClass(TypeFactory.java:1247)
                                               at com.fasterxml.jackson.databind.type.TypeFactory._fromAny(TypeFactory.java:1150)
                                               at com.fasterxml.jackson.databind.type.TypeFactory.constructType(TypeFactory.java:618)
                                               at com.fasterxml.jackson.databind.cfg.MapperConfig.constructType(MapperConfig.java:290)
                                               at com.fasterxml.jackson.databind.cfg.MapperConfig.introspectClassAnnotations(MapperConfig.java:320)
                                               at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findTypeDeserializer(BasicDeserializerFactory.java:1338)
                                               at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:481)
                                               at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3890)
                                               at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3756)
                                               at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2198)
                                               at dk.nykredit.jackson.dataformat.hal.deser.HALBeanDeserializer.deserialize(HALBeanDeserializer.java:27)
                                               at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789)
                                               at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2913)
                                               at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:179)
                                               at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:174)
                                               at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:89)
                                               at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:738)
                                               at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:723)
                                               at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:544)
                                               at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:506)
                                               at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:455)
                                               at nl.app.App.API.RestClient_.getAdviseurs(RestClient_.java:117)
                                               at nl.app.App.Services.AdviseurService.getAdviseur(AdviseurService.java:60)
                                               at nl.app.App.Services.AdviseurService.getAdviseurAsync(AdviseurService.java:49)
                                               at nl.app.App.Services.AdviseurService_.access$101(AdviseurService_.java:19)
                                               at nl.app.App.Services.AdviseurService_$2.execute(AdviseurService_.java:66)
                                               at org.androidannotations.api.BackgroundExecutor$Task.run(BackgroundExecutor.java:405)
                                               at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
                                               at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                               at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
                                               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)

【问题讨论】:

    标签: java android jackson guava


    【解决方案1】:

    该异常似乎与RateLimiter 没有任何关系。堆栈跟踪表明 Spring 和/或 Jackson 试图通过 null 引用上的反射调用 .equals()。我的猜测是您将 null 传递给您不应该传递的东西 - 如果速率限制器没有足够的许可,您可能会返回 null

    如果没有看到有问题的代码,很难确切地说出是什么导致了这个错误。尝试创建一个复制错误的MCVE - 很可能只需创建 MCVE 就足以让您找到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2017-04-16
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多