JSON Parser -java.lang.NoSuchFieldError: defaultReader

JSON Parser -java.lang.NoSuchFieldError: defaultReader

我正在使用 JSON 解析器来提取值,并且我正在使用以下 jar json-path-2.1.0,当我调用在 weblogic 服务器上部署为 webservice 的用例时出现以下错误 我写了一个小的主程序来从 json 字符串中提取值并且它工作正常,但是用例的服务器版本给出了问题。我不确定我耳朵的其他部分是否有任何其他罐子会对此产生负面影响

SEVERE: defaultReader
java.lang.NoSuchFieldError: defaultReader
at com.jayway.jsonpath.spi.json.JsonSmartJsonProvider.<init>(JsonSmartJsonProvider.java:39)
at com.jayway.jsonpath.internal.DefaultsImpl.jsonProvider(DefaultsImpl.java:21)
at com.jayway.jsonpath.Configuration.defaultConfiguration(Configuration.java:174)
at com.jayway.jsonpath.internal.JsonContext.<init>(JsonContext.java:52)
at com.jayway.jsonpath.JsonPath.parse(JsonPath.java:596)

看起来 JsonParser jar 存在于 JVM 1.8 版本中,它似乎比 Json-[= 中可用的 JsonParser class 具有更高的优先级12=]。显然 us 案例在 12.2.1 版本的 weblogic 服务器中不起作用,但它在 12.1.3

中工作正常

偶然发现了同样的问题。

不工作的原因不是JDK 8. 您遇到此问题的原因是 weblogic 12.2.1.X 捆绑了一些旧版本的 json-smart.

在我的机器上,可以在这里找到: jar:file:/C:/dev/WLS_12_2_1_2_0/oracle_common/modules/net.minidev.json-smart.jar!/net/minidev/json/JSONValue.class

现在,如果您正在使用依赖于 json-smart 的 json-path 这样的库,那么默认情况下,容器将使用其构建的其中一个加载所需的 class - 在模块中。

你的问题似乎是你的 json-path 所依赖的 JSONValue class 似乎有这个 defaultReder 字段。 这是正在爆炸的土块的片段。

 public JsonSmartJsonProvider() {
        this(JSONParser.MODE_PERMISSIVE, JSONValue.defaultReader.DEFAULT_ORDERED);
    }

那个

JSONValue.defaultReader

似乎在 weblogs 旧系统上无效 class 加载器 class。

您可以通过在 weblogic.xml 部署描述符中放入如下内容来告诉容器使用您正在打包的内容:

<wls:prefer-application-packages>       
<wls:package-name>net.minidev.json.*</wls:package-name>                              
</wls:prefer-application-packages>

我在让 weblogic 吞下上面的细粒度指令时遇到了很多麻烦。 我发现自己强制 weblogic 吞下所有进入 web-inf 文件夹的内容,而不是做:

 <wls:container-descriptor>
        <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>        
    </wls:container-descriptor>

我宁愿不使用像 web-inf-classes 这样的锤子,但是当我不进行粗粒度处理时,我正在与 weblogic 系统 classloader 共舞。 .

此致。

我也遇到了这个问题,结果发现其他一些库使用的是 json-smart 的旧版本,并且它的优先级高于 json-path 的 json-smart依赖。删除另一个罐子解决了这个问题。或者您也可以将 json-path 的版本降级到适当的版本,以便它支持 json-smart 的旧版本。

我有同样的问题,但我使用 Gradle 所以我不得不添加:

compile group: 'net.minidev', name: 'json-smart', version: '2.3' 我的依赖。