如果该属性的访问者被定义为isProperty()
而不是,则Dozer似乎不会映射布尔属性getProperty()
.
以下groovy脚本说明了问题:
import org.dozer.*
class ProductCommand {
Boolean foo
}
public class ProductDto {
private Boolean foo;
public Boolean isFoo() { this.foo }
public void setFoo(Boolean p0) { this.foo = p0 }
}
def mapper = new DozerBeanMapper()
dto = new ProductDto(foo: true)
assert dto.isFoo()
ProductCommand mappedCmd = mapper.map(dto, ProductCommand)
assert mappedCmd.foo
Run Code Online (Sandbox Code Playgroud)
最后一行的断言失败了.不过,如果我重新命名ProductDto.isFoo()
,以ProductDto.getFoo()
它传递.
是否有我可以在Dozer映射文件中设置的标志/选项,它将指示它使用布尔属性的访问器is
或get
访问器?或者,我可以为每个布尔属性添加自定义规则,但这不是很吸引人.
虽然上面的例子是用Groovy编写的,但我没有理由相信相同的Java代码不会表现出同样的行为.
这些DTO由JAXB生成(它生成"is"访问器,而不是booleans的"get"访问器),因此我无法重命名访问器.我正在使用Dozer 5.3.2.
我必须映射一个复杂的Java类结构,它通常不会通过set-/get-methods暴露它们的字段(这是给定的,不能更改).因此,映射只能在直接字段访问上执行.推土机允许个别字段可访问,但我没有找到设置使这成为一般行为.因此,我不必为了使其可访问而明确地映射每个字段!
这个选项存在吗? - 在课堂上? - 在全球范围内?
我正在开发一个Spring Boot项目.我只有注释配置.我想包括推土机将实体转换为DTO,将DTO转换为实体.我在dozer网站上看到,他们解释说我必须在spring xml配置文件中添加以下配置.由于我没有xml文件而是注释配置Java类,我不知道如何将其转换为Java Configuration类.
<bean id="org.dozer.Mapper" class="org.dozer.DozerBeanMapper">
<property name="mappingFiles">
<list>
<value>dozer-global-configuration.xml</value>
<value>dozer-bean-mappings.xml</value>
<value>more-dozer-bean-mappings.xml</value>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
如果有人能给我一个例子,它会非常有用.谢谢
我正在研究java spring mvc应用程序,并且有一个关于将视图模型对象映射到数据库模型对象的重要问题.我们的应用程序使用dozer映射器来实现此目的.
假设我有一个Person模型和BaseInformation模型.该BaseInformation模式是可以在所有其他机型上使用,例如一般数据性别,颜色,单位,....
BaseInformation:
class BaseInformation{
private Long id;
private String category;
private String title;
}
Run Code Online (Sandbox Code Playgroud)
这可以有一个像这样的数据库表:
Id | Category | Title
-------------------------
1 | "gender" | "male"
2 | "gender" | "female"
3 | "color" | "red"
4 | "color" | "green"
...
Run Code Online (Sandbox Code Playgroud)
这是我的人物模型的一部分:
public class Person{
...
private BaseInformation gender;
...
}
Run Code Online (Sandbox Code Playgroud)
这是我的RegisterPersonViewModel的一部分
public class RegisterPersonViewModel{
...
private Integer gender_id; …
Run Code Online (Sandbox Code Playgroud) 让我们说我想映射以下两个类:
public class A {
String member;
public void setMember(String member) { this.member = member }
public String getMember() { return member }
}
public class B {
String member;
public B(String member) { this.member = member }
public String getMember() { return member }
}
Run Code Online (Sandbox Code Playgroud)
现在,当我想要Dozer进行以下转换时:dozerBeanMapper.map( a, B.class );
由于缺少类的默认构造函数,我收到错误B
.
解决这个问题的最佳方法是什么?使用自定义转换器?
我有这个问题.但是我很难解释,因为我不知道使用的确切术语.希望有人能理解.我会试着尽力而为.我觉得这与此有很大关系parsing
说有两个班.在这两个类中我都有一些变量,比如字符串(只是为了简单起见,变量类型可以是任何变量),它们具有相似的名称.
Eg:
class ClassA{
String x,y,z;
}
class ClassB{
String x,y,z;
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要的是,我需要将一个类的变量值的值复制到其他类对应的变量.
Eg:
ClassA aa=new ClassA();
ClassB bb=new ClassB();
//set bb's variables
aa.x=bb.x;
aa.y=bb.y;
aa.z=bb.z;
Run Code Online (Sandbox Code Playgroud)
像那样.
但请注意,我需要的不是上述方法.我希望有一种方法可以编写一个简单的方法,以便它通过传递给它的名称来识别相关变量.然后它会相应地进行值赋值.
我想象的方法是这样的,
void assign(String val){
// aa.<val>=val
}
Run Code Online (Sandbox Code Playgroud)
例如,如果您传递bb.x
给assign(...)
方法,那么它将进行aa.x=bb.x
分配.
希望这很清楚.必须有更好的方法来解释这一点.如果有人知道,请编辑帖子(+标题)以使其更清晰(但保存我的想法)..
如果有办法实现这一点,请告诉我.
谢谢!
使用我的数据模型,它基本上是一个带有父项子项的树,Dozer在将字段(使用接口类型作为参数)解释为类时尝试成功映射它们,并尝试使用构造函数实例化它.这导致以下异常;
ERROR [MappingProcessor] - Field mapping error -->
MapId: null
Type: null
Source parent class: com.*.shared.model.Module
Source field name: parent
Source field type: class com.*.shared.model.Datawarehouse
Source field value: com.*.shared.model.Datawarehouse@706ce458
Dest parent class: com.*.shared.model.Module
Dest field name: parent
Dest field type: com.*.shared.model.Model
org.dozer.MappingException: java.lang.NoSuchMethodException: com.*.shared.model.Model.<init>()
Run Code Online (Sandbox Code Playgroud)
这是一个相同类的映射,并且Whilst Dozer正确地将源类上的父字段标识为Datawarehouse类型,因为其父类的Module类上的set方法使用Model接口作为其参数,它似乎是在尝试实例化模型的类型,当然,因为Model是一个没有构造函数的接口,而不是Datawarehouse,因为源类字段指示.
我知道使用bean-factory来改变标准的映射行为,但我很惊讶这是解决这个问题的唯一方法.在我看来,Dozer已经拥有了它所需的信息,因为它识别了源类类型,并且我不同意它会尝试实例化setter签名指定的接口而不是它试图映射的类型.
有什么建议?
我遇到了一个非常奇怪的异常,我不知道如何找到原因.
商业背景:添加商品并同时列出价格表,商品有差价水平用户的5个价格.
在控制器中,首先使用dozer将goodForm转换为商品,然后调用goodsService来保存商品.在货物服务保存货物后,遍历货物价格表并填充货物ID到货物价格,
GoodsForm:
@Mapping("priceList")
List<GoodsPriceForm> goodsPriceFormList;
Goods:
List<GoodsPrice> priceList;
Controller:
Goods goods = BeanMapper.map(goodsForm, Goods.class);
goodsService.saveGoods(adminId, goods);
GoodsService:
goodsDao.save(goods);
goods.getPriceList().forEach(p -> p.setGoodsId(goods.getId()));
goodsPriceDao.save(goods.getPriceList());
Run Code Online (Sandbox Code Playgroud)
但它抛出异常:
2015-11-27 17:10:57,042 [http-nio-8081-exec-8] ERROR o.a.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: com.foo.goods.model.GoodsPrice cannot be cast to com.foo.goods.model.GoodsPrice] with root cause
java.lang.ClassCastException: com.foo.goods.model.GoodsPrice cannot be cast to com.foo.goods.model.GoodsPrice
at com.foo.goods.service.GoodsService$$Lambda$11/310447431.accept(Unknown Source) ~[na:na]
at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_51]
at com.foo.goods.service.GoodsService.saveGoods(GoodsService.java:34) ~[classes/:na]
Run Code Online (Sandbox Code Playgroud)
这个错误信息让我感到很困惑.另外我写一个单元测试想重复这个,但失败了.
GoodsForm form = new …
Run Code Online (Sandbox Code Playgroud) 我需要使用dozer框架将A类映射到C类.
public class A {
private String fielda1;
private String fielda2;
public String getFielda1() {
return fielda1;
}
public void setFielda1(String fielda1) {
this.fielda1 = fielda1;
}
public String getFielda2() {
return fielda2;
}
public void setFielda2(String fielda2) {
this.fielda2 = fielda2;
}
}
public class B {
private List<C> cList;
public List<C> getcList() {
return cList;
}
public void setcList(List<C> cList) {
this.cList = cList;
}
public static class C {
private String fieldc1;
private String fieldc2;
public String …
Run Code Online (Sandbox Code Playgroud) 如何以编程方式为推土机设置自定义转换器?以下代码不起作用:
定制转换器实现:
class ConverterImpl extends DozerConverter<A, B> {
ConverterImpl() {
super(A.class, B.class);
}
@Override
public B convertTo(A source, B destination) {
return destination;
}
@Override
public A convertFrom(B source, A destination) {
return destination;
}
}
Run Code Online (Sandbox Code Playgroud)
测试代码:
DozerBeanMapper mapper = new DozerBeanMapper();
mapper.setCustomConverters(Collections.<CustomConverter>singletonList(new ConverterImpl()));
A a = new A();
B b = mapper.map(a, A.class);
Run Code Online (Sandbox Code Playgroud)
运行上面的代码后,不会调用自定义转换器.怎么了?
dozer ×10
java ×10
mapping ×3
annotations ×1
classloader ×1
dto ×1
groovy ×1
interface ×1
javabeans ×1
oop ×1
parsing ×1
spring ×1
spring-boot ×1
spring-mvc ×1