我需要使用dozer框架将A类映射到C类.
public class A {
private String fielda1;
private String fielda2;
public String getFielda1() {
return fielda1;
}
public void setFielda1(String fielda1) {
this.fielda1 = fielda1;
}
public String getFielda2() {
return fielda2;
}
public void setFielda2(String fielda2) {
this.fielda2 = fielda2;
}
}
public class B {
private List<C> cList;
public List<C> getcList() {
return cList;
}
public void setcList(List<C> cList) {
this.cList = cList;
}
public static class C {
private String fieldc1;
private String fieldc2;
public String …Run Code Online (Sandbox Code Playgroud)
我正在尝试使用Dozer Java API使用自定义转换器映射两个java类.有没有办法在Java中配置类级自定义转换器?现在我必须在XML中添加配置:
<configuration>
<custom-converters>
<converter type="com.abc.A2BConverter" >
<class-a>com.abc.ClassA</class-a>
<class-b>com.abc.ClassB</class-b>
</converter>
</custom-converters>
</configuration>`
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!
我有一个源对象,它具有:
public class Source {
public Map<String,DTO>getDTOs();
}
Run Code Online (Sandbox Code Playgroud)
和目标对象:
public class Destination {
public List<DTO> getDTOs();
public void setDTOs(List<DTO> dtos);
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用Dozer为我做这个映射,但我有点难过.我对单元测试和文档进行了分类,但我的挑战是我不确定我在寻找什么.
编辑:引入了一个新的lib,它澄清了新版本的内容
从版本5.5.0开始,Spring集成了额外的模块dozer-spring.
嗨,我对Dozer和Spring相对比较新,对于如何实现这一点感到有些困惑.
来自推土机网站:http://dozer.sourceforge.net/documentation/usage.html
Spring集成 ......
<bean id="mapper" class="org.dozer.DozerBeanMapper">
<property name="mappingFiles">
<list>
<value>dozer-global-configuration.xml</value>
<value>dozer-bean-mappings.xml</value>
<value>more-dozer-bean-mappings.xml</value>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
现在来自http://dozer.sourceforge.net/documentation/springintegration.html:
<bean class="org.dozer.spring.DozerBeanMapperFactoryBean">
<property name="mappingFiles" value="classpath*:/*mapping.xml"/>
<property name="customConverters">
<list>
<bean class="org.dozer.converters.CustomConverter"/>
</list>
</property>
<property name="eventListeners">
<list>
<bean class="org.dozer.listeners.EventListener"/>
</list>
</property>
<property name="factories">
<map>
<entry key="id" value-ref="bean-factory-ref"/>
</map>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
所以我不确定我应该使用哪种方式.我的目标是在我的业务类中有一个mapper对象,它将转换Business Objects为DTO(反向).所以我认为它应该是一个基本的依赖注入?
谢谢你的帮助.
简单来说,为什么我们需要在Web应用程序中使用"bean to bean映射服务"(如Dozer).
假设我正在开发一项网络服务.
为什么还要添加一个将XML元素映射到自定义元素的步骤.
我无法说服自己,可能是因为我无法想到更好的情况/原因.
如果可能的话,请举例说明.
背景:Spring Boot项目,添加商品和商品价目表
Goods:
List<GoodsPrice> pricelist;
Run Code Online (Sandbox Code Playgroud)
在控制器中首先将货物形式转换为货物(通过推土机),然后保存货物,保存货物后迭代货物价目表以填充货物 ID。
goods.getPriceList().forEach(p -> p.setGoodsId(goods.getId()));
Run Code Online (Sandbox Code Playgroud)
迭代商品价目表时,抛出异常:
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]
Run Code Online (Sandbox Code Playgroud)
有人提醒我这个与classloader有关的异常,在eclipse调试模式下,我输出了GoodsPrice的ClassLoader:
sun.misc.Launcher$AppClassLoader@14dad5dc
Run Code Online (Sandbox Code Playgroud)
和货物:
org.springframework.boot.devtools.restart.classloader.RestartClassLoader@591c6338
确实存在差异类加载器。然后我评论spring-boot-devtools然后再次尝试这次没关系。那么如果仍然保留spring-boot-devtools,如何解决这个问题?
我们有一些我们试图映射的遗留数据......遗留数据包含月份日的字段...
是否可以转换
MyObject.day
MyObject.year
MyObject.month
Run Code Online (Sandbox Code Playgroud)
至
MyOtherObject.date
Run Code Online (Sandbox Code Playgroud)
我找不到关于这个主题的任何文件.任何人将不胜感激.
我编写了一个实体,其中只包含一个LocalDateTime使用Super CSV的 CSV文件,ICsvDozerBeanWriter并且在使用a读取它时遇到错误ICsvDozerBeanReader.我能够成功读取和写入一个Date对象,但LocalDateTime无法正常工作.
我添加了super-csv-java8依赖项,写入部分似乎工作正常.
我在这个Github仓库中创建了一个小型演示应用程序来复制问题.运行main()方法,错误将输出到控制台.
这是我得到的例外:
2016-12-09 22:24:02.427 ERROR 50405 --- [ main] org.dozer.MappingProcessor : Field mapping error -->
MapId: null
Type: null
Source parent class: org.supercsv.io.dozer.CsvDozerBeanData
Source field name: columns
Source field type: class java.time.LocalDateTime
Source field value: 2016-12-09T22:24:02.226
Dest parent class: com.example.Entity
Dest field name: dateTime
Dest field type: java.time.LocalDateTime
org.dozer.MappingException: java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:82) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:261) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.ConstructionStrategies$ByConstructor.create(ConstructionStrategies.java:245) ~[dozer-5.4.0.jar:na]
at …Run Code Online (Sandbox Code Playgroud) 我想使用推土机将数据对象映射到基本相同的传输对象。对象包含一个通用字段。我希望通用字段映射到相同的类型,在这个例子中是整数。但是映射对象的泛型类型是 String。我正在使用推土机版本 6.0.0。如何映射泛型并保留类型?
数据对象:
public class DataObject<T> {
T generic;
public DataObject() {
}
public T getGeneric() {
return generic;
}
public void setGeneric(final T generic) {
this.generic = generic;
}
}
Run Code Online (Sandbox Code Playgroud)
运输对象:
public class TransportObject<T> {
T generic;
public TransportObject() {
}
public T getGeneric() {
return generic;
}
public void setGeneric(final T generic) {
this.generic = generic;
}
}
Run Code Online (Sandbox Code Playgroud)
映射测试:
import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
public class DozerGenericsTest …Run Code Online (Sandbox Code Playgroud) dozer ×10
java ×8
mapping ×2
classloader ×1
csv ×1
generics ×1
java-8 ×1
spring ×1
spring-boot ×1
supercsv ×1
web-services ×1