2017-09-07 5 views
1

J'utilise le RateLimiter de Guava, donc je ne tape pas les requêtes max par seconde (Its 5 ..) à l'API. Cela fonctionne bien, je n'ai jamais atteint la limite de débit maintenant, mais j'ai un problème étrange maintenant. Pour une raison quelconque, il donne 1 fois sur 5 en cours d'exécution l'application d'une exception pour l'un des 6 appels:Exception d'analyse Jackson lors de l'utilisation du RateLimiter de Guava

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) 

Répondre

0

Cette exception ne semble pas avoir quelque chose à voir avec RateLimiter. La trace de la pile indique que Spring et/ou Jackson ont essayé d'appeler .equals() via une réflexion sur une référence null. Je suppose que vous passez null à quelque chose que vous ne devriez pas être - peut-être que vous retournez null si le limiteur de débit n'a pas assez de permis?

Sans voir le code en question, il est difficile de dire exactement ce qui cause cette erreur. Essayez de créer un MCVE qui réplique l'erreur - il est probable que la création du MCVE suffira pour que vous trouviez le problème.