2017-02-15 32 views
1

Недавно я начал работу с библиотекой hiffrix netflix. Я создал объект HystrixCommand, но я получил NPE. В идеале этого не должно быть. Любая помощь будет оценена по достоинству. Это известная проблема?Исключение нулевого указателя в библиотеке hystrix netflix

Пожалуйста найти трассировку стека:

Exception in thread "main" java.lang.NullPointerException 
    at com.netflix.config.ConcurrentMapConfiguration.clearConfigurationListeners(ConcurrentMapConfiguration.java:330) 
    at org.apache.commons.configuration.event.EventSource.<init>(EventSource.java:76) 
    at org.apache.commons.configuration.AbstractConfiguration.<init>(AbstractConfiguration.java:63) 
    at com.netflix.config.ConcurrentMapConfiguration.<init>(ConcurrentMapConfiguration.java:68) 
    at com.netflix.config.ConcurrentCompositeConfiguration.<init>(ConcurrentCompositeConfiguration.java:172) 
    at com.netflix.config.ConfigurationManager.getConfigInstance(ConfigurationManager.java:125) 
    at com.netflix.config.DynamicPropertyFactory.getInstance(DynamicPropertyFactory.java:263) 
    at com.netflix.config.DynamicProperty.getInstance(DynamicProperty.java:245) 
    at com.netflix.config.PropertyWrapper.<init>(PropertyWrapper.java:58) 
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius$ArchaiusDynamicProperty.<init>(HystrixDynamicPropertiesArchaius.java:62) 
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius$StringDynamicProperty.<init>(HystrixDynamicPropertiesArchaius.java:73) 
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius.getString(HystrixDynamicPropertiesArchaius.java:34) 
    at com.netflix.hystrix.strategy.HystrixPlugins.getPluginImplementationViaProperties(HystrixPlugins.java:344) 
    at com.netflix.hystrix.strategy.HystrixPlugins.getPluginImplementation(HystrixPlugins.java:334) 
    at com.netflix.hystrix.strategy.HystrixPlugins.getPropertiesStrategy(HystrixPlugins.java:243) 
    at com.netflix.hystrix.strategy.properties.HystrixPropertiesFactory.getCommandProperties(HystrixPropertiesFactory.java:62) 
    at com.netflix.hystrix.AbstractCommand.initCommandProperties(AbstractCommand.java:204) 
    at com.netflix.hystrix.AbstractCommand.<init>(AbstractCommand.java:163) 
    at com.netflix.hystrix.HystrixCommand.<init>(HystrixCommand.java:61) 

ответ

2

я столкнулся с аналогичной проблемой, и вот как я решил.

Hystrix -> использует archaius-ядро-0.4.1.jar -> который использует Викисклад конфигурацию-1.8.jar

Но из-за баночки конфликтов в моем текущем проекте, Обще-конфигурация-1.3.jar является представить вместо Викисклада конфигурационной 1.8.jar

к сожалению, кажется ошибки в Викискладе конфигурационной 1.3.jar в конструкторе org.apache.commons.configuration.event.EventSource (который я объясню ниже)

Итак, мое предложение - это изучить ваш путь к классу, и я su re вы найдете commons-configuration-1.3.jar. Если это так, просто убедитесь, что у вас есть правильный commons-configuration-1.8.jar. Это должно решить вашу проблему!

Первопричины:

com.netflix.config.ConcurrentMapConfiguration -> является суб класс org.apache.commons.configuration.AbstractConfiguration -> который является суб класс org.apache.commons .configuration.event.EventSource

Вот скелет

public class ConcurrentMapConfiguration extends AbstractConfiguration { 
    ... 
    private Collection<ConfigurationListener> listeners = new CopyOnWriteArrayList<ConfigurationListener>();  
    ... 
    public ConcurrentMapConfiguration() { 
     ... 
    } 
    ... 
    @Override 
    public void clearConfigurationListeners() { 
     listeners.clear(); // Here is the null pointer exception 
    } 
    ... 
} 

Но в (Обще источников событий конфигурация-1.3.jar)

public class EventSource { 
    ... 
    public EventSource() 
    { 
     clearConfigurationListeners(); // This is the culprit 
    } 
    ... 
    public void clearConfigurationListeners() 
    { 
     listeners = new LinkedList(); 
    } 
    ... 
} 

Как вы ясно видите в конструкторе EventSource, вы видите вызов метода clearConfigurationListeners(). И этот метод был переопределен в подклассе ConcurrentMapConfiguration. Таким образом, будет вызван метод подкласса. Но к этому времени слушатели по-прежнему имеют нулевое значение, потому что только после выполнения суперклассического класса подкласс может начать инициализацию своего материала. Следовательно, NPE.

Но события от (Обще-конфигурации-1.4.jar и выше) - это фиксированный

public class EventSource { 
    ... 
    public EventSource() 
    { 
     initListeners(); // this is good 
    } 
    ... 
    private void initListeners() // private method... Much better! No one can override this :) 
    { 
     listeners = new LinkedList(); 
     ... 
    } 
    ... 
} 

Надеется, что это помогает!