标签: dozer

非平凡的推土机映射

我正在努力让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列表中.这可能吗?

java javabeans dozer

5
推荐指数
1
解决办法
6908
查看次数

如何关闭只是推土机的调试?

有没有办法关闭只是推土机的调试日志?至少不必将其增加到调试级别以上?

logging dozer

4
推荐指数
1
解决办法
6084
查看次数

DTO使用Java,Dozer和Hibernate映射和更新到数据库

我正在使用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的整个目的.

谢谢你的帮助.

java hibernate dto dozer

4
推荐指数
1
解决办法
7331
查看次数

推土机文件未找到异常

我正在尝试执行下面的推土机示例.我的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)

源代码 …

dozer

4
推荐指数
1
解决办法
9372
查看次数

始终将null对象映射为null

我正在寻找一种方法将每个null对象映射到null而不是"org.dozer.MappingException: Source object must not be null"错误.我不想枚举每个类并说null映射为null,我想将其指定为一般规则.

dozer

4
推荐指数
1
解决办法
7702
查看次数

推土机映射:到目的地的多个源

我是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)

是否可以使用一个映射配置文件执行此操作?

java dozer

4
推荐指数
1
解决办法
1万
查看次数

如何告诉Dozer使用编程API绕过每个字段映射空字符串或空字符串值?

常见问题解答说明了如何使用XML执行此操作。这显示了如何使用API按类进行操作。问题是您必须在课堂上设置它。如果我只想在一个领域上怎么办?这可能吗?

java dozer

4
推荐指数
2
解决办法
1万
查看次数

使用Dozer的自定义转换器将对象列表映射到另一个列表

我想要做的是使用Dozer将实体列表映射到它们的字符串ID列表(或多或少).

显然,它意味着Custom Converter.我的第一个想法是从MyEntity转换为String,然后对Dozer说"使用此转换器映射此集合的每个对象".但我无法弄清楚如何做到这一点.

所以我的第二个想法是直接将转换器形成一个实体列表到一个字符串列表.关于这个想法我的问题是,我正在讨论一些荒谬的事情,即在构造函数中获取我的列表类型,如下所示(这根本不起作用):

public MyEntityListConverter() {
    super(List<MyEntity>.class, List<String>.class);
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何在一行中传递一个实例化列表的类,而不会声明任何内容.

所以如果有人知道:

  • 如何指定dozer一个在集合映射中使用的对象转换器
  • 如何获取实例化列表类型
  • 尝试的第三种/更好的解决方案

java orm spring arraylist dozer

4
推荐指数
1
解决办法
7216
查看次数

Dozer - 排除嵌套对象

根据此示例,您可以使用 Dozer 进行深度映射:

http://dozer.sourceforge.net/documentation/deepmapping.html

<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>
Run Code Online (Sandbox Code Playgroud)

但这并没有按预期工作。有没有其他方法可以排除嵌套对象的字段?

java mapping dozer

4
推荐指数
1
解决办法
78
查看次数

Exlude字段 - 使用Dozer进行映射

我想用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?提前致谢.

java mapping dozer

3
推荐指数
1
解决办法
6007
查看次数

标签 统计

dozer ×10

java ×7

mapping ×2

arraylist ×1

dto ×1

hibernate ×1

javabeans ×1

logging ×1

orm ×1

spring ×1