我想做点什么:
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)
但是持有者对象是空的.我也没有运气改变第二个参数...
我试图找出一种简单的方法来将DTO映射到没有样板代码的实体.虽然我在考虑使用dozer,但似乎需要大量的xml配置.有没有人看过使用DSL在纯Java中配置bean映射的推土机替代方案?
理想情况下,我希望找到一个受Guice做事方式启发的bean映射器.
我有一点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.
这将允许我概括一些我需要在每个孩子中实施的方法,这些方法很糟糕.
谢谢!
我正在使用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) 我正在使用Spring事务,因此当POJO到DTO转换发生时,事务仍处于活动状态.
我想阻止Dozer触发延迟加载,以便隐藏的sql查询永远不会发生:所有提取都必须通过HQL显式完成(以获得对性能的最佳控制).
这是一个好习惯(我无法在任何地方找到它)?
怎么安全地做?
我在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会话,并不会阻止延迟加载.
我有这样的枚举:
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.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)
请指导我解决问题.
我正在使用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然后单独留下它.
有人可以为我解释一下吗?
我为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) 在我的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) 我目前正在使用Dozer将Entity
对象映射到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)