Java集合转换报错: No property named “xxx“ exists in source parameter(s). Did you mean “empty“?

今天用MapStruct将一个类的集合转换成另一个,然后就报了上面的错误,No property named “xxx“ exists in source parameter(s). Did you mean “empty“?
翻译过来就是在入参里面找不到某个字段,可是我传的list对应的类里面确实能搜到它提示的字段,通过编译后的转换类发现是我转换的时候用到了==@Mapping(target = “xxx”,source = “xxx”)==,这个注解的作用是将两个类里面字段名不一样的进行转换,当把这个放到list转换的方法上面就会报上面的错,是因为list个笨蛋并不能获取到我定义的类名进行转换所以就会编译报错(因为我们要想通过List获取到里面类的某个字段要进行list.get(index).get(字段名),MapStruct很显然没有这么智能,转换的时候只能通过 ==要转换的类.get(字段名)=入参.get(字段名)==这种形式进行获取)。
在这里插入图片描述
那么集合转换的时候怎么解决这个问题呢,仔细观察一个不加注解的list转换编译之后的程序之后发现集合之间的转换其实也是通过遍历整个集合然后挨个转换实现的(调用单个转换的方法,如果直接写list转换的话系统会生成一个供你调用)。
在这里插入图片描述
上面说了,只写一个list转换的话系统会给你自动生成一个单个类转换的方法,如果我们不用系统生成的,自己写一个然后加上@Mapping(target = “xxx”,source = “xxx”)岂不是就可以实现目的了,说干就干。
在这里插入图片描述
神奇的事情发生了,编译好的文件自动调用了我们自定义的方法,问题完美解决。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
非常抱歉,是我的疏忽,我漏掉了一个地方。在定义`reports`数组之前,需要先定义一个空的`reports`字符串,然后在比较每个文件的内容后,将告添加到`reports`字符串中。最后,将`reports`字符串拼接到HTML告模板中。以下是更新后的代码: ```groovy @Grab(group='com.googlecode.java-diff-utils', module='diffutils', version='1.3.0') import difflib.* import java.nio.file.* // 定义两个文件夹的路径 def dir1 = Paths.get("path/to/first/directory") def dir2 = Paths.get("path/to/second/directory") // 遍历两个文件夹中的所有csv文件 def files1 = findFiles(dir1, "csv") def files2 = findFiles(dir2, "csv") // 定义HTML告的模板 def htmlTemplate = """ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>CSV文件比较告</title> <style> table { border-collapse: collapse; width: 100%; } th, td { text-align: left; padding: 8px; } tr:nth-child(even) { background-color: #f2f2f2; } .added { background-color: #aaffaa; } .deleted { background-color: #ffaaaa; } .changed { background-color: #ffffaa; } </style> </head> <body> <h1>CSV文件比较告</h1> ${reports} </body> </html> """ // 定义告字符串 def reports = "" // 对于每一个csv文件,比较其在两个文件夹中的内容 (files1 + files2).unique().each { file -> def path1 = dir1.resolve(file) def path2 = dir2.resolve(file) if (Files.exists(path1) && Files.exists(path2)) { // 如果文件在两个文件夹中都存在,则比较文件内容 def lines1 = Files.readAllLines(path1) def lines2 = Files.readAllLines(path2) def patch = DiffUtils.diff(lines1, lines2) reports += "<h2>${file}</h2>\n" reports += "<table>\n" reports += "<tr><th>行号</th><th>内容</th></tr>\n" def lineNum = 1 patch.getDeltas().each { delta -> // 对于每一个差异,将其以HTML格式呈现,并将差异字段高亮显示 delta.getOriginal().each { line -> reports += "<tr class='deleted'><td>${lineNum++}</td><td>${line}</td></tr>\n" } delta.getRevised().each { line -> reports += "<tr class='added'><td>${lineNum++}</td><td>${line}</td></tr>\n" } delta.getOriginal().size().upto(delta.getOriginal().size() + delta.getRevised().size() - 1) { i -> reports += "<tr class='changed'><td>${i+1}</td><td>${delta.getRevised().get(i - delta.getOriginal().size())}</td></tr>\n" } } reports += "</table>\n" } else { // 如果文件只在一个文件夹中存在,则将其标记为“文件不存在” reports += "<h2>${file} (文件不存在)</h2>\n" } } // 输出HTML告 def reportFile = new File("report.html") reportFile << htmlTemplate.replace("${reports}", reports) // 定义一个函数,用于遍历一个文件夹中的所有指定扩展名的文件 def findFiles(dir, ext) { def files = [] Files.walk(dir).forEach { path -> if (Files.isRegularFile(path) && path.getFileName().toString().endsWith(".${ext}")) { files.add(dir.relativize(path).toString()) } } return files } ``` 现在,`${reports}`就可以正确地输出了。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值