Ho riscontrato un'eccezione molto strana e non so come trovare il motivo.Un'eccezione della mappa dozer relativa agli sviluppatori di avvio di primavera
Business background: Aggiungi merci e nel frattempo il suo listino prezzi, una merce ha 5 prezzi per utente di livello diff.
Nel controller, convertire prima GoodForm in merci utilizzando dozer, quindi chiamare goodsService per salvare le merci. In goodsService dopo il salvataggio merci, merci attraversamento listino prezzi e popolare goodsId al prezzo delle merci,
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());
Ma buttare eccezione:
messaggio2015-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]
Questo errore fammi sentire molto confuso. In aggiunta scrivo un test unitario che volevo ripetere, ma non ci sono riuscito.
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()));
Eseguire questo test dell'unità, è stato eseguito correttamente. Allora perché nella situazione reale del web (Spring boot + Jpa) è fallito, ma in situazione di test unitario va bene?
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
Se ho generato un barattolo confezionato, quindi eseguire questa giara
java -jar target/myapp.jar
In questo caso senza eccezioni sopra.
E ho commentato spring-boot-devtools in pom.xml, quindi ho avviato l'applicazione, senza eccezioni.
L'unica volta che ho avuto un'eccezione del genere è se si carica la stessa classe con 2 diversi caricatori di classe. Puoi provare a stampare il caricatore di classe di ogni oggetto? –
Quindi la stessa classe è stata caricata da due diversi caricatori di classe. La prima misura è di avere la classe in un solo barattolo in una posizione. –
@Wim Deblauwe Ho provato la tua strada, per favore vedi il mio contenuto supplementare in fondo a questo post – zhuguowei