【问题标题】:WSDLToJava: NPE in AbstractGenerator calling new VelocityGenerator(false) when org.slf4j.helpers.NOPLogger is on the classpathWSDLToJava:当 org.slf4j.helpers.NOPLogger 在类路径上时,AbstractGenerator 中的 NPE 调用 new VelocityGenerator(false)
【发布时间】:2021-04-23 23:02:54
【问题描述】:

升级到 CXF 3.4.1 后调用 WSDLToJava 时,我在 Hashtable 中得到了一个 NullPointerException

完整的堆栈跟踪:

org.apache.cxf.tools.common.ToolException: Tools can not load the frontend plugin class org.apache.cxf.tools.wsdlto.frontend.jaxws.generators.AntGenerator
    at org.apache.cxf.tools.wsdlto.core.PluginLoader.getFrontEndGenerators(PluginLoader.java:275)
    at org.apache.cxf.tools.wsdlto.core.PluginLoader.getFrontEndProfile(PluginLoader.java:385)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.loadFrontEnd(WSDLToJava.java:64)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:96)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:86)
    ... 19 more
Caused by: org.apache.cxf.tools.common.ToolException: Failed to initialize velocity engine
    at org.apache.cxf.tools.common.VelocityGenerator.initVelocity(VelocityGenerator.java:91)
    at org.apache.cxf.tools.common.VelocityGenerator.<init>(VelocityGenerator.java:53)
    at org.apache.cxf.tools.wsdlto.core.AbstractGenerator.<init>(AbstractGenerator.java:47)
    at org.apache.cxf.tools.wsdlto.frontend.jaxws.generators.AbstractJAXWSGenerator.<init>(AbstractJAXWSGenerator.java:30)
    at org.apache.cxf.tools.wsdlto.frontend.jaxws.generators.AntGenerator.<init>(AntGenerator.java:44)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.apache.cxf.tools.wsdlto.core.PluginLoader.getFrontEndGenerators(PluginLoader.java:270)
    ... 24 more
Caused by: java.lang.NullPointerException
    at java.util.Hashtable.put(Hashtable.java:460)
    at org.apache.commons.collections.ExtendedProperties.addPropertyInternal(ExtendedProperties.java:723)
    at org.apache.commons.collections.ExtendedProperties.addProperty(ExtendedProperties.java:671)
    at org.apache.commons.collections.ExtendedProperties.setProperty(ExtendedProperties.java:737)
    at org.apache.commons.collections.ExtendedProperties.convertProperties(ExtendedProperties.java:1693)
    at org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:645)
    at org.apache.velocity.runtime.RuntimeSingleton.init(RuntimeSingleton.java:226)
    at org.apache.velocity.app.Velocity.init(Velocity.java:97)
    at org.apache.cxf.tools.common.VelocityGenerator.initVelocity(VelocityGenerator.java:87)
    ... 34 more

怎么了?我该如何解决这个问题?

【问题讨论】:

    标签: wsdl cxf classpath velocity


    【解决方案1】:

    AbstractGenerator 调用 VelocityGenerator(false) 将字段 log 设置为 false

    initVelocity() 中的代码将创建一个org.slf4j.helpers.NOPLogger 的实例(如果可以的话)并将其放入Properties 实例中。

    最终,org.apache.commons.collections.ExtendedProperties.convertProperties(Properties) 将被调用。这一行

    c.setProperty(s, props.getProperty(s));
    

    导致调用Hashtable.put(s, null),因为Properties.getProperty() 将为映射中的非字符串元素(如NOPLogger 实例)返回null

    罪魁祸首是在类路径上有两个 Velocity 实现。一个是 1.x 版本,坐标为 org.apache.velocity:velocity,一个是 org.apache.velocity:velocity-engine-core,版本是 2.2。

    排除对 Velocity 1.x 的依赖以修复此错误。 Velocity 2.x 使用 ExtProperties 而不是 ExtendedProperties,其中包含针对此错误的补丁。

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多