一尘不染

JSON解析器-java.lang.NoSuchFieldError:defaultReader

json

我正在使用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)

阅读 782

收藏
2020-07-27

共1个答案

一尘不染

偶然发现了同样的问题。

它不起作用的原因不是JDK8。之所以遇到此问题,是因为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,那么默认情况下,容器将使用其内置模块之一加载所需的类。

您遇到的麻烦似乎是您的json路径所依赖的JSONValue类似乎具有此defaultReder字段。这是正在爆炸的凝块的片段。

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

JSONValue.defaultReader

似乎在Weblogs较早的系统类加载器类上无效。

您可以通过将如下所示的内容放入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-class那样使用锤子,但是当我不粗粒度的时候,我正在与weblogic系统类加载器共舞…

问候。

2020-07-27