为了账号安全,请及时绑定邮箱和手机立即绑定

从Servlet调用Jackson JSON解析器时获取ClassNotFoundException

从Servlet调用Jackson JSON解析器时获取ClassNotFoundException

拉丁的传说 2021-04-29 22:18:06
我有一个由Tomcat 8驱动的servlet,它需要一个静态方法来用Jackson 2.9.6执行JSON解析。在代码执行期间:JSONData parsedJSONData = PDFGenerator.parseJSONDocument(jsonDocument);我得到:java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException重要的是要注意,servlet类和PDFGenerator类位于不同的包中,但是带有public访问修饰符。我试图通过pom.xml将依赖项添加到项目的根目录:<dependency>     <groupId>com.fasterxml.jackson.core</groupId>     <artifactId>jackson-core</artifactId>     <version>2.9.6</version></dependency>但这无济于事。在我的项目中,我没有使用Maven,而是通过添加了所需的库classpath。奇怪的是,只有当我尝试PDFGenerator.parseJSONDocument(jsonDocument)从servlet调用时,这种异常才会出现,而从常规Java类执行的过程就可以顺利进行。我的问题:为了能够使用基于FasterXML / Jackson JSON库的JSON解析器功能调用静态方法,我应该添加什么位置?
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

这个问题几乎可以肯定是由您的servlet容器(Tomcat 8.x)中的类加载器无法找到Jackson的库/ JAR引起的。在Servlet容器中装入类/库的方式与独立Java应用程序中的标准类路径声明不同。这就是为什么您从servlet引擎看到错误,而不是在直接执行类的过程中看到错误的原因。以下是有关Tomcat 8.x如何处理类加载的常规文档:

https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

作为一般规则,首先要帮助防止此类问题,将servlet部署在“ webapp”容器中(包括所有必需的库(必需的JAR的适当版本等))是一个好主意。这样做会将您的servlet隔离在单个类加载器下,并自动将它们定位在正确的层次结构中。请参阅链接文档的这一部分:

WebappX —为部署在单个Tomcat实例中的每个Web应用程序创建一个类加载器。Web应用程序的/ WEB-INF / classes目录中的所有未解压缩的类和资源,以及Web应用程序的/ WEB-INF / lib目录下的JAR文件中的类和资源,对于此Web应用程序都是可见的,但不是给其他人。

仅供参考,还有其他方法可以使用企业级Web应用程序执行此操作,但是我们在这里不做讨论。


查看完整回答
反对 回复 2021-05-12
  • 1 回答
  • 0 关注
  • 258 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信