2016-12-04 156 views
3

我正在使用JSON解析器来提取值,我正在使用以下jar json-path-2.1.0,并且当我调用在weblogic服务器上部署为webservice的用例 我编写了一个小型的主程序,用于从json字符串中提取值并且工作正常,但用例的服务器版本提供了该问题。我不知道是否有我的耳朵的任何其他部分瓶子可以造成负面影响这一JSON解析器-java.lang.NoSuchFieldError:defaultReader

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) 

回答

2

发生了同样的问题。

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

在我的机器,这将在这里找到: 的jar:文件:/ C:/dev/WLS_12_2_1_2_0/oracle_common/modules/net.minidev.json-smart.jar /net/minidev/json/JSONValue.class!

现在,如果您正在使用像json-smart这样依赖于json-smart的库,那么默认情况下,容器将使用其内置模块之一加载所需的类。

你有的爆炸似乎是你的json路径依赖的JSONValue类似乎有这个defaultReder字段。 这是一个正在吹起来的clode的snipet。

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

JSONValue.defaultReader 

似乎不是博客上的旧系统类加载器类有效。

你可以告诉容器通过投入您的weblogic.xml部署描述符像这样使用你正在收拾东西:

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

我有相当多的麻烦的WebLogic吞细上面的指令指令。 我发现自己逼WebLogic中swallog所有进入WEB-INF文件夹,而不是做:

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

我本来不想使用像WEB-INF类锤子,但我有跳舞weblogic系统类加载程序,当我不去粗粒...

问候。

0

貌似JsonParser罐子存在于JVM 1.8版,它似乎有过在Json-可用JsonParser类更优先path.jar。显然,美国的情况并不适用于12.2.1版本的weblogic服务器,但它在12.1.3中正常工作。

0

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