加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 与Spring引导devtools相关的推土机映射异常

发布时间:2020-12-15 00:40:16 所属栏目:Java 来源:网络整理
导读:我遇到了一个非常奇怪的异常,我不知道如何找到原因. 经营背景: 添加商品,同时它的价格表,商品有差价水平用户的5个价格. 在控制器中,首先使用dozer将goodForm转换为商品,然后调用goodsService来保存商品. 在货物服务后保存货物,遍历货物价格表并填充货物ID到
我遇到了一个非常奇怪的异常,我不知道如何找到原因.

经营背景:
添加商品,同时它的价格表,商品有差价水平用户的5个价格.

在控制器中,首先使用dozer将goodForm转换为商品,然后调用goodsService来保存商品.
在货物服务后保存货物,遍历货物价格表并填充货物ID到货物价格,

GoodsForm:
@Mapping("priceList")
List<GoodsPriceForm> goodsPriceFormList;
Goods:
List<GoodsPrice> priceList;

Controller: 
Goods goods = BeanMapper.map(goodsForm,Goods.class);
goodsService.saveGoods(adminId,goods);

GoodsService:
goodsDao.save(goods);
goods.getPriceList().forEach(p -> p.setGoodsId(goods.getId()));
goodsPriceDao.save(goods.getPriceList());

但它抛出异常:

2015-11-27 17:10:57,042 [http-nio-8081-exec-8] ERROR o.a.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: com.foo.goods.model.GoodsPrice cannot be cast to com.foo.goods.model.GoodsPrice] with root cause
java.lang.ClassCastException: com.foo.goods.model.GoodsPrice cannot be cast to com.foo.goods.model.GoodsPrice
at com.foo.goods.service.GoodsService$$Lambda$11/310447431.accept(Unknown Source) ~[na:na]
at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_51]
at com.foo.goods.service.GoodsService.saveGoods(GoodsService.java:34) ~[classes/:na]

这个错误信息让我感到非常困惑.另外我写一个单元测试想重复这个,但失败了.

GoodsForm form = new GoodsForm();
form.setGoodsPriceFormList(Lists.newArrayList(new GoodsPriceForm((byte) 1,BigDecimal.valueOf(10)),new GoodsPriceForm((byte) 2,BigDecimal.valueOf(9)),new GoodsPriceForm((byte) 3,BigDecimal.valueOf(8))));

Goods goods = BeanMapper.map(form,Goods.class);
goods.getPriceList().forEach(p -> p.setGoodsId(goods.getId()));

运行此单元测试,执行正常.
那么为什么在真实的网络情况下(Spring boot Jpa)它失败了,但是在单元测试情况下它还可以吗?

Controller:
System.out.println("PriceList: " + goods.getPriceList().getClass().getClassLoader());//PriceList: null
System.out.println(goods.getPriceList().get(0).getClass().getClassLoader()); //java.lang.ClassCastException: com.foo.goods.model.GoodsPrice cannot be cast to com.foo.goods.model.GoodsPrice

如果我生成了一个打包的jar,那么执行这个jar

java -jar target/myapp.jar

在这种情况下没有上述例外.

我在pom.xml中评论了spring-boot-devtools,然后启动了应用程序,没有异常.

解决方法

By default,any open project in your IDE will be loaded using the “restart” classloader,and any regular .jar file will be loaded using the “base” classloader. If you work on a multi-module project,and not each module is imported into your IDE,you may need to customize things. To do this you can create a META-INF/spring-devtools.properties file.

The spring-devtools.properties file can contain restart.exclude. and restart.include. prefixed properties. The include elements are items that should be pulled-up into the “restart” classloader,and the exclude elements are items that should be pushed down into the “base” classloader. The value of the property is a regex pattern that will be applied to the classpath.

我的解决方案:将META-INF / spring-devtools.properties放在resources文件夹中,并添加此内容

restart.include.dozer=/dozer-5.5.1.jar

请参阅:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools-customizing-classload

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读