【问题标题】:Null Pointer Exception in netflix hystrix librarynetflix hystrix 库中的空指针异常
【发布时间】:2017-07-04 03:09:36
【问题描述】:

最近我开始研究 netflix hystrix 库。我创建了一个 HystrixCommand 对象,但我得到了一个 NPE。理想情况下,它不应该发生。任何帮助将不胜感激。这是一个已知问题吗?

请查找堆栈跟踪:

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)

【问题讨论】:

    标签: java nullpointerexception hystrix netflix


    【解决方案1】:

    我遇到了类似的问题,我是这样解决的。

    Hystrix -> 使用archaius-core-0.4.1.jar -> 它使用commons-configuration-1.8.jar

    但由于我当前项目中的 jar 冲突,存在 commons-configuration-1.3.jar 而不是 commons-configuration-1.8.jar

    不幸的是,org.apache.commons.configuration.event.EventSource的构造函数中似乎有一个commons-configuration-1.3.jar中的错误(我将在下面解释) p>

    所以,我的建议是查看您的类路径,我相信您会找到 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
       }
       ...
    }
    

    但是在EventSource(commons-configuration-1.3.jar)中

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

    正如您在 EventSource 的构造函数中清楚地看到的那样,您会看到对方法 clearConfigurationListeners() 的调用。并且此方法已在子类 ConcurrentMapConfiguration 中被覆盖。因此,将调用子类方法。但是此时 listeners 仍然为空,因为只有在超类构造函数完成后,子类才能开始初始化它的东西。因此是 NPE。

    但在 EventSource (commons-configuration-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();
           ...
       }
       ...
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2013-12-19
      • 2017-01-10
      • 2015-07-12
      相关资源
      最近更新 更多