我正在努力让Dozer屈服于我的意志,我觉得应该很简单.我有两个相似的模型,我想在它们之间进行映射,但是一个具有比另一个更"深"的层次结构,这在处理集合时会引起我的问题.考虑以下类:
来源类:
class Foo {
String id;
NameGroup nameGroup;
// Setters/Getters
}
class NameGroup {
private List<Name> names;
// Setters/Getters
}
class Name {
private String nameValue;
// Setters/Getters
}
Run Code Online (Sandbox Code Playgroud)
目的地类:
class Bar {
private String barId;
private BarNames barNames;
// Setters/Getters
}
class BarNames {
private List<String> names;
// Setters/Getters
}
Run Code Online (Sandbox Code Playgroud)
现在我想要以下单向映射:
Foo.id -> Bar.barId // Simple enough
Run Code Online (Sandbox Code Playgroud)
但我需要:
Foo.nameGroup.names.nameValue -> Bar.barNames.names
Run Code Online (Sandbox Code Playgroud)
因此,每个Name
实例都Foo.nameGroup.names
应该导致String
添加到BarNames.names
列表中.这可能吗?
我正在使用Dozer将Hibernate实体映射到他们的DTO.简化的示例类如下:
@Entity
public class Role {
@Id
@GeneratedValue
@Column(name="RoleId", nullable=false)
public int roleId;
@Column(name="RoleName", nullable=false)
@NotEmpty
public String roleName;
//get + set (not for the roleId since its autogenerated)
}
Run Code Online (Sandbox Code Playgroud)
public class RoleDTO {
private int roleId;
private String roleName;
public RoleDTO(int roleId, String roleName) {
this.roleId = roleId;
this.roleName = roleName;
}
public RoleDTO() {}
//gets + sets
}
Run Code Online (Sandbox Code Playgroud)
现在映射工作正常,但我在尝试进行更新时遇到问题.假设我的数据库中有一个角色(1,"管理员").我的视图首先使用更新的字段生成DTO:
RoleDTO roleDTO = new RoleDTO(1, "admin");
Run Code Online (Sandbox Code Playgroud)
最终,持久化角色的类接收DTO并通过Dozer将其转换为Entity类以保留更改:
Role role = DozerMapper.map(roleDTO,Role.class);
Run Code Online (Sandbox Code Playgroud)
此时,我的角色实体已丢失其ID,可能是因为ID列被定义为自动增量,我显然无法更新null-ID实体.
那么我应该如何处理这个问题,以便ID和更新的字段全部映射到实体?我总是可以使用hibernate来实现实体对象,并使用DTO中的每个字段更新它们并将其保存回来,但它会破坏使用Dozer的整个目的.
谢谢你的帮助.
我正在尝试执行下面的推土机示例.我的xml文件位于与我的java文件相同的位置,但我收到的文件未找到异常
Exception in thread "main" org.dozer.MappingException: Unable to locate dozer mapping file [dozerMapping.xml] in the classpath!
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:87)
at org.dozer.util.MappingValidator.validateURL(MappingValidator.java:63)
at org.dozer.loader.CustomMappingsLoader.loadFromFiles(CustomMappingsLoader.java:101)
at org.dozer.loader.CustomMappingsLoader.load(CustomMappingsLoader.java:56)
at org.dozer.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:213)
at org.dozer.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:186)
at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:111)
at com.mapping.CopyAttributes.main(CopyAttributes.java:28)
Run Code Online (Sandbox Code Playgroud)
如果我给完整文件路径它正在工作,但我得到以下异常
Exception in thread "main" org.dozer.MappingException: java.net.MalformedURLException: unknown protocol: c
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:82)
at org.dozer.util.ResourceLoader.getResource(ResourceLoader.java:57)
at org.dozer.util.DefaultClassLoader.loadResource(DefaultClassLoader.java:44)
at org.dozer.util.MappingValidator.validateURL(MappingValidator.java:61)
at org.dozer.loader.CustomMappingsLoader.loadFromFiles(CustomMappingsLoader.java:101)
at org.dozer.loader.CustomMappingsLoader.load(CustomMappingsLoader.java:56)
at org.dozer.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:213)
at org.dozer.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:186)
at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:111)
at com.mapping.CopyAttributes.main(CopyAttributes.java:28)
Caused by: java.net.MalformedURLException: unknown protocol: c
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at org.dozer.util.ResourceLoader.getResource(ResourceLoader.java:55)
Run Code Online (Sandbox Code Playgroud)
源代码 …
我正在寻找一种方法将每个null对象映射到null而不是"org.dozer.MappingException: Source object must not be null"
错误.我不想枚举每个类并说null映射为null,我想将其指定为一般规则.
我是DOZER制图的新手
我们可以将属性从多个源类映射到目标吗?
例如
class A {
int a;
int b;
}
class B {
String c;
}
class Destination {
int a;
int b;
String c;
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用一个映射配置文件执行此操作?
我想要做的是使用Dozer将实体列表映射到它们的字符串ID列表(或多或少).
显然,它意味着Custom Converter.我的第一个想法是从MyEntity转换为String,然后对Dozer说"使用此转换器映射此集合的每个对象".但我无法弄清楚如何做到这一点.
所以我的第二个想法是直接将转换器形成一个实体列表到一个字符串列表.关于这个想法我的问题是,我正在讨论一些荒谬的事情,即在构造函数中获取我的列表类型,如下所示(这根本不起作用):
public MyEntityListConverter() {
super(List<MyEntity>.class, List<String>.class);
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何在一行中传递一个实例化列表的类,而不会声明任何内容.
所以如果有人知道:
根据此示例,您可以使用 Dozer 进行深度映射:
http://dozer.sourceforge.net/documentation/deepmapping.html
Run Code Online (Sandbox Code Playgroud)<mapping> <class-a>com.github.dozermapper.core.vo.deep.SrcDeepObj</class-a> <class-b>com.github.dozermapper.core.vo.deep.DestDeepObj</class-b> <field> <a>srcNestedObj.src1</a> <b>dest1</b> </field> <field> <a>srcNestedObj.src2</a> <b>dest2</b> </field> <field> <a>srcNestedObj.srcNestedObj2.src5</a> <b>dest5</b> </field> </mapping>
同样,我想排除几个嵌套的对象和字段,所以我尝试了同样的方法:
Run Code Online (Sandbox Code Playgroud)<mapping map-id="case1" map-null="false"> <class-a>com.server.dal.entities.ClassA</class-a> <class-b>com.server.dal.dto.ClassB</class-b> <field-exclude> <a>childObj1.childObj2</a> <b>childObj1.childObj2</b> </field-exclude> <field-exclude> <a>childObj1.childObj3.testMap</a> <b>childObj1.childObj3.testMap</b> </field-exclude> </mapping>
但这并没有按预期工作。有没有其他方法可以排除嵌套对象的字段?
我想用Dozer排除一个字段,如下所示:
<mapping>
<class-a>com.core.model.Model</class-a>
<class-b>com.core.model.ModelIS</class-b>
<field>
<a>person</a>
<b>person</b>
<a-hint>com.core.Person</a-hint>
<b-hint>com.core.PersonIS</b-hint>
</field>
<field-exclude>
<a>age</a>
<b>age</b>
</field-exclude>
</mapping>
Run Code Online (Sandbox Code Playgroud)
所以类Model包含一个Person对象而Person有一个age对象,如何从这个映射中排除age?提前致谢.