我有一个多模块maven项目,在dao模块中,我添加了JSON-IO依赖项。当我尝试反序列化我的对象时,它给了我:
Exception in thread "main" com.cedarsoftware.util.io.JsonIoException: Class listed in @type [hu.kleatech.projekt.model.Employee] is not found
类名是正确的,Employee是公共的,dao将模块作为依赖项。什么可能出错?
编辑:由于这是一个老问题并且很久以前就得到了回答,我删除了我专门针对这个问题制作的github存储库。问题的解决方案在接受的答案中,确切的代码是不相关的。
答案 0 :(得分:1)
请尝试向Employee类添加一个空构造函数。
编辑:实际上,虽然添加一个空构造函数可以解决问题,但并不是必需的。 Json-IO"将勇敢地努力实例化Class中传递的内容,包括调用其所有构造函数直到成功。他们尝试的命令是公开的,最少的参数首先是私有的,参数最多。"
(从MetaUtils.java javadoc复制)
此外,在调用多参数构造函数时,库会使用null和基元的默认值填充参数。然后忽略构造函数调用期间抛出的任何异常。在您的情况下,抛出了NullPointerException,因为构造函数不是null安全的。因此,要么修改构造函数以便它可以处理空值,要么添加一个空构造函数。
答案 1 :(得分:0)
根据您的项目和模块Pom,您的主Pom应按以下顺序安装模块....
<modules>
<module>core</module>
<module>controller</module>
<module>service</module>
<module>dao</module>
</modules>
员工类在核心中可用,它应该在核心jar中可用。
您应该在主Pom中添加depencyManagent,然后在dependencyManagement中添加所有模块作为依赖项,这样无论谁将主Pom添加为依赖项,都可以访问所有的jar。
更改订单后,再次构建项目,然后更新您的maven项目。
如果此代码正在另一个项目中使用,那么请确保您已将jar上传到存储库(mvn deploy),以便使用它的任何人都可以在构建项目时下载它。
验证是否在使用或未使用该主项目的情况下下载此jar的一种方法是检查项目资源管理器中是否存在Maven依赖项部分,您可以在其中查看所有依赖项jar并检查核心是否存在。
我不确定主Pom中的控制器模块是做什么的,因为我在项目中找不到该名称的模块,因此您应该删除它或为其添加模块(文件夹)。
答案 2 :(得分:0)
Maven依赖关系配置是<parent>
元素的分层结构,而不是<modules>
元素。
这意味着在项目的pom.xml
文件中,您依赖于&#34; JSON-IO依赖&#34;您没有依赖于dao
项目或该类所在的位置。
<modules>
仅代表定义要构建的项目。模块顺序定义无关紧要,因为Maven按所需的依赖关系检测顺序
因此,您可以在
中的<parent>
pom.xml中定义依赖关系
<dependencies>
元素。然后所有的孩子都会拥有它。
或<dependencyManagement>
- 然后需要它的孩子可以将其包含在<dependencies>
中,而不需要常见的配置,例如版本,范围等......
在这里看一下非常相似的答案: How to minimize maven pom.xml