标签: dozer

如何在Dozer中映射集合

我想做点什么:

ArrayList<CustomObject> objects = new ArrayList<CustomObject>();
...
DozerBeanMapper MAPPER = new DozerBeanMapper();
...
ArrayList<NewObject> newObjects = MAPPER.map(objects, ...); 
Run Code Online (Sandbox Code Playgroud)

假设:

<mapping>
  <class-a>com.me.CustomObject</class-a>
  <class-b>com.me.NewObject</class-b>   
    <field>  
      <a>id</a>  
      <b>id2</b>  
    </field>  
</mapping>
Run Code Online (Sandbox Code Playgroud)

我试过了 :

ArrayList<NewObject> holder = new ArrayList<NewObject>();
MAPPER.map(objects, holder);
Run Code Online (Sandbox Code Playgroud)

但是持有者对象是空的.我也没有运气改变第二个参数...

java mapping data-mapping dozer

23
推荐指数
3
解决办法
5万
查看次数

推土机替代bean映射?

我试图找出一种简单的方法来将DTO映射到没有样板代码的实体.虽然我在考虑使用dozer,但似乎需要大量的xml配置.有没有人看过使用DSL在纯Java中配置bean映射的推土机替代方案?

理想情况下,我希望找到一个受Guice做事方式启发的bean映射器.

dto-mapping guice dto dozer

21
推荐指数
2
解决办法
3万
查看次数

如何获取父基类对象super.getClass()

我有一点Java问题(作为一名C++程序员).

我有2个相关的课程:

public class Patient() {
...
}

public class PatientPersistent extends Patient {
...
    public void foo() {
    System.out.println(super.getClass().toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出:

class org.example.smartgwt.server.model.PatientPersistent

有没有办法获得父类类型?即

class org.example.smartgwt.server.model.Patient.

这将允许我概括一些我需要在每个孩子中实施的方法,这些方法很糟糕.

谢谢!


UPDATE

我正在使用Dozer将我的域Hibernate对象转换为Serializable版本.我不希望客户知道这一点,因此客户只能看到Patient类.在服务器端,我执行转换.

public class DataObject<Type> {

    private static final Class<Object> DstType = Type;

    public Object convert(Object srcData, final BeanFactory factory) {
        Mapper mapper = (Mapper)factory.getBean("dozerMapper");

        return (Object)mapper.map(srcData, DstType);
    }
}

public class Patient() implements Serializable {
    public Set foo;
}    

public class PatientPersistent extends Patient {

    public org.hibernate.collection.PersistentSet …
Run Code Online (Sandbox Code Playgroud)

java class dozer

17
推荐指数
3
解决办法
5万
查看次数

防止Dozer触发Hibernate延迟加载

我正在使用Spring事务,因此当POJO到DTO转换发生时,事务仍处于活动状态.

我想阻止Dozer触发延迟加载,以便隐藏的sql查询永远不会发生:所有提取都必须通过HQL显式完成(以获得对性能的最佳控制).

  1. 这是一个好习惯(我无法在任何地方找到它)?

  2. 怎么安全地做?

我在DTO转换之前试过这个:

PlatformTransactionManager tm = (PlatformTransactionManager) SingletonFactoryProvider.getSingletonFactory().getSingleton("transactionManager");
tm.commit(tm.getTransaction(new DefaultTransactionDefinition()));
Run Code Online (Sandbox Code Playgroud)

我不知道事务发生了什么,但Hibernate会话没有关闭,延迟加载仍然发生.

我试过这个:

SessionFactory sf = (SessionFactory) SingletonFactoryProvider.getSingletonFactory().getSingleton("sessionFactory");
sf.getCurrentSession().clear();
sf.getCurrentSession().close();
Run Code Online (Sandbox Code Playgroud)

它可以防止延迟加载,但是直接在应用程序层(在我的项目中称为"facade")中操作会话是一种很好的做法吗?我应该担心哪些负面影响?(我已经看到涉及POJO - > DTO转换的测试无法通过AbstractTransactionnalDatasource Spring测试类启动,因为这些类尝试触发对不再链接到活动会话的事务的回滚).

我还尝试将传播设置为NOT_SUPPORTED或REQUIRES_NEW,但它重用当前的Hibernate会话,并不会阻止延迟加载.

java spring hibernate dozer spring-transactions

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

Dozer String to enum mapping

我有这样的枚举:

public enum PartnershipIndicator {
    VENDOR("VENDOR"), COPARTNER("COPARTNER"), BUYER("BUYER");

    String code;

    private PartnershipIndicator(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    public static PartnershipIndicator valueOfCode(String code) {
        for (PartnershipIndicator status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException(
            "Partnership status cannot be resolved for code " + code);
    }

    @Override
    public String toString() {
        return code;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要将其转换为String,反之亦然.现在,它由自定义转换器完成.但我想通过推土机映射(如果有可能)这样做.如果我不写任何映射到推土机confing,我得到

org.dozer.MappingException: java.lang.NoSuchMethodException: by.dev.madhead.demo.test_java.model.PartnershipIndicator.<init>()
Run Code Online (Sandbox Code Playgroud)

例外.我不能将默认的公共构造函数添加到枚举中,因为它是不可能的.所以,我用内部代码和valueOfCode()/ toString()写了一个技巧.这是行不通的.然后,我在dozer配置中映射它:

<mapping>
    <class-a>java.lang.String</class-a>
    <class-b create-method="valueOfCode">by.dev.madhead.demo.test_java.model.PartnershipIndicator</class-b>
</mapping> …
Run Code Online (Sandbox Code Playgroud)

java string mapping enums dozer

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

java.lang.ClassNotFoundException:来自BaseClassLoader的org.apache.commons.lang.StringUtils

运行以下代码时出现以下错误:

java.lang.ClassNotFoundException: org.apache.commons.lang.StringUtils from BaseClassLoader

at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:448)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.dozer.util.ResourceLoader.getResource(ResourceLoader.java:53)
at org.dozer.util.DefaultClassLoader.loadResource(DefaultClassLoader.java:44)
at org.dozer.config.GlobalSettings.loadGlobalSettings(GlobalSettings.java:116)
at org.dozer.config.GlobalSettings.<init>(GlobalSettings.java:67)
at org.dozer.config.GlobalSettings.<clinit>(GlobalSettings.java:46)
at org.dozer.stats.StatisticsManagerImpl.<init>(StatisticsManagerImpl.java:39)
at org.dozer.stats.GlobalStatistics.<init>(GlobalStatistics.java:29)
at org.dozer.stats.GlobalStatistics.<clinit>(GlobalStatistics.java:24)
at org.dozer.DozerBeanMapper.<clinit>(DozerBeanMapper.java:59)
Run Code Online (Sandbox Code Playgroud)

请指导我解决问题.

java web-services dozer java-ee

15
推荐指数
3
解决办法
7万
查看次数

推土机映射JodaTime属性不按预期工作

我正在使用Dozer在Document类和DocumentManagementBean类之间进行映射,这两个都是我自己制作的.两者都有一个Joda DateTime类型的getter和setter属性,名为dateAdded.

当Document对象d具有property dateAdded= x时,调用mapper.map(d, DocumentManagementBean.class)所有字段都会自动正确映射(因为我可以完全控制代码库,我可以通过没有dozer-config而只依赖于匹配的属性名称),除了dateAdded字段,其中新的DocumentManagementBean 以其属性中dmb当前 DateTime 结束dateAdded,而不是来自d对象的x .

我期待Dozer试着打电话

dmb.setDateAdded(d.getDateAdded());

并且只是将dateAdded的值从source添加到target,但它似乎是为dmb对象创建新的DateTime然后单独留下它.

有人可以为我解释一下吗?

java mapping jodatime dozer

13
推荐指数
3
解决办法
5598
查看次数

使用Dozer映射对象列表

我为ClassA创建了一个推土机映射到ClassB.

现在我想将a映射List<ClassA>到a List<ClassB>.

是否有可能

mapper.map(variableListClassA, variableListClassB) 
Run Code Online (Sandbox Code Playgroud)

或者我必须经过一个循环,例如

for (ClassA classA : variableListClassA) {
    variableListClassB.add(mapper.map(classA, ClassB.class))
}
Run Code Online (Sandbox Code Playgroud)

java mapping dozer

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

将JPA或Hibernate投影查询映射到DTO(数据传输对象)

在我的DAO层中,我有一个像这样的Find函数

public List<?> findCategoryWithSentenceNumber(int offset, int maxRec) {
  Criteria crit = getSession().createCriteria(Category.class, "cate");
    crit.createAlias("cate.sentences", "sent");

    crit.setProjection(Projections.projectionList().
    add(Projections.property("title"), "title").
    add(Projections.count("sent.id"), "numberOfSentence").
    add(Projections.groupProperty("title"))
  );

  crit.setFirstResult(offset);
  crit.setMaxResults(maxRec);

  return crit.list();
}
Run Code Online (Sandbox Code Playgroud)

所以,为了读取数据,我必须使用一个循环(带Iterator)

List<?> result = categoryDAO.findCategoryWithSentenceNumber(0, 10);
// List<DQCategoryDTO> dtoList = new ArrayList<>(); 

for (Iterator<?> it = result.iterator(); it.hasNext(); ) {
  Object[] myResult = (Object[]) it.next();

  String  title = (String) myResult[0];
  Long count = (Long) myResult[1];


  assertEquals("test", title); 
  assertEquals(1, count.intValue()); 

  // dQCategoryDTO = new DQCategoryDTO();
  // dQCategoryDTO.setTitle(title);
  // dQCategoryDTO.setNumberOfSentence(count);
  // dtoList.add(dQCategoryDTO);

} …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa dozer

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

推土机:如何限制映射的深度?

我目前正在使用DozerEntity对象映射到Dto项目中的对象.

我的问题是如何限制内部映射的级别或深度?

例如我有一个AccountProfile其中有一个实体List<AccountProfileDetail>的实体作为成员.此外,AccountProfileDetail它本身也有一个FinancialTransLimit实体作为成员.

现在我想告诉映射器,例如只做映射depth = 2.因此该FinancialTransLimit成员不会被复制到AccountProfileDetail目标对象的成员.

我需要使用Programming API而不是在xml中指定深度.但是,我也没有在xml配置中找到它.

我也试过Orika,但我也没能在Orika找到这样的功能!

以下两个代码(用于使用Dozer和Orika作为替代方案进行测试)可以正常工作并进行深层复制.我需要限制其中至少一个的深度.

有人可以帮帮我吗?

非常感谢!

示例代码:

AccountProfile

//My Entities:
import java.util.List;

public class AccountProfile{

    private Long id;
    private String name;
    private List<AccountProfileDetail> accountProfileDetails;

    public AccountProfile() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String …
Run Code Online (Sandbox Code Playgroud)

java dozer object-object-mapping

13
推荐指数
1
解决办法
584
查看次数