我一直在寻找在推土机映射中设置常量值的解决方案,并且在stackoverflow上阅读了很多关于这个问题的答案。所以我决定使用推土机自定义转换器。
让我澄清一下我的情况。
我有两个具有以下字段的bean:
豆A:
String name;
String phone;
String bankId;
Bean B:
String branch;
String phone;
String name;
String bankId;
Bean B
的分支
字段应始终等于"1111"
。
因此,我创建了一个自定义转换器:
public class ConstantToTypeConverter extends DozerConverter<String, String> {
public ConstantToTypeConverter() {
super(String.class, String.class);
}
@Override
public String convertTo(String source, String destination) {
if (getParameter().equalsIgnoreCase("TYPE")) {
return "1111";
}
return null;
}
@Override
public String convertFrom(String source, String destination) {
return convertTo(source, destination);
}
}
以及以下映射:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping type="one-way" map-id="map-test">
<class-a>BeanA</class-a>
<class-b>BeanB</class-b>
<field custom-converter="ConstantToTypeConverter"
custom-converter-param="TYPE">
<!-- Can use any existing field of String here, since there is a custom converter -->
<a>name</a>
<b>branch</b>
</field>
</mapping>
</mappings>
它工作得很好,并将分支
值设置为"1111"
。但是这种方法看起来很糟糕:
<!-- Can use any existing field of String here, since there is a custom converter -->
<a>name</a>
<b>branch</b>
我必须在XML映射中设置一个name
字段作为源,才能启动我的自定义转换器,因为Dozer需要源字段和目标字段,即使源字段实际上并不需要。通常,它会使我的代码不清楚并且难以维护。
我想我犯了一个错误,或者以不恰当的方式使用了这种方法。谁能解释一下这个问题吗?
我使用推土机5.5.1
除CustomConverter之外的另一个选项是创建初始化bean的BeanFactory。
public class BeanBFactory implements org.dozer.BeanFactory {
@Override
public Object createBean(Object source, Class<?> sourceClass, String targetBeanId) {
return new BeanB(Constants.X, Constants.Y, ...);
}
}
<mapping>
<class-a>BeanA</class-a>
<class-b bean-factory="BeanBFactory">
BeanB
</class-b>
</mapping>
您不应该计算代码行数;它可能比硬编码转换要长(至少对于简单bean)。
请注意:如果这确实是实现我所寻找的目标的唯一方法,那么我会接受基于XML的解决方案,但我更喜欢使用Dozer的Java API的解决方案。 我是推土机的新手,正在尝试了解如何使用其API。它似乎默认为字段级映射(如果字段名称匹配),并允许在字段级映射(基于字段名称)不可能或不符合应用程序需要的情况下使用自定义映射器和转换器。 我有一种情况,我的应用程序将接受一个DTO,例如,
我不确定我是否正确理解推土机映射器中的自定义创建方法。我需要将int类型的bean属性转换为TransTypeCodebook对象实例。但我得到了: 我的TransTypeCodebook课程 映射器部分 我设法通过自定义转换器解决了这个问题,但我不确定我是否理解自定义创建方法的概念,我想知道这个字符串是从哪里来的。有人能解释一下吗?
考虑以下类。如何在不使用自定义转换器的情况下使用Dozer将A类转换为B类? 有人能为上述类提供推土机映射XML吗?
问题内容: 在这个奇怪的例子中,有人创建了一个新类型,它实际上只是一个字符串: 但是,此代码无法编译: 不能在返回参数中使用Foobar(CustomType类型)作为类型字符串 您将如何修复SomeFunction,使其能够返回Foobar的字符串值(“ somestring”)? 问题答案: 将值转换为字符串:
我有一个非常复杂的对象。 我的目标是将问题答案集映射展平,以便将值中的所有列表合并为一个 我没有试图找出如何在Dozer中将所有这些列表合并到一个列表中,我甚至不确定它是否能够做到,而是编写了一个自定义setter。 我假设这意味着Dozer只需读取第一个对象的调查并将其放入makeFlatSurvey,但它读取调查对象上的questionAnswerGroup字段,然后遍历QuestionAns
我有一个NestJSRESTAPI,并将TypeORM与MongoDB一起使用。我想创建一个名为的实体。我从一个基本实体开始,我刚刚读到我应该使用,而不是。 我想知道是否可以用字符串类型的主列替换该对象id列。字段基于特殊模式,例如name字段 我超棒的项目 将导致 我很棒的项目 对于id字段。当然,我使用了生成的,但是我必须传递一个自定义字符串,而不是。目前这是不可能的,因为文档说 可以是24字