假设我有一个目标对象
MyObject {
boolean myBoolean;
int myInt;
...
}
其中的字段myBoolean和myInt是必填字段(即,如果您尝试在Builder上为MyObject调用build()而不设置这些字段,则会引发错误)。
尽管尝试了许多似乎与此功能相关的MapStruct构造,但我似乎找不到一种简单的方法来告诉MapStruct为对象中的每个字段设置默认值以确保已设置所有必填字段。
。
Builder target = new Target.builder();
if (source != null) {
if ( source.isMyBoolean() != null ) {
target.withMyBoolean( source.isMyBoolean() );
}
...
}
target.build();
在上面的字段Source中的myBoolean是一个布尔值(相对于布尔值)。如您所见,如果source.isMyBoolean == null,则不会调用target.withMyBoolean(...),从而导致错误。
我发现解决这个问题的唯一方法是为每个必需的属性在每个详细的@Mapping级别上指定一个NullValueMappingStrategy或defaultValue。
想知道是否有人知道一种更好的方法来实现这一目标。
答案 0 :(得分:0)
如果目标对象具有基元,则字段具有默认值,否?
就像在文档NullValueMappingStrategy.RETURN_DEFAULT中说的那样,在bean上工作,列出...但是您不正确在Integer,String,Boolean上。
如果我有:
public class MyObjectDTO {
Boolean myBoolean;
Integer myInt;
String myString;
TempObjectDTO tempObjectDTO;
}
public class MyObject {
Boolean myBoolean;
Integer myInt;
String myString;
TempObject tempObject;
}
映射MyObject <-> MyObjectDTO之后:
为避免这种情况,我在映射器中为String,Integer,Boolean创建了映射方法,并使用了工厂,因为Integer和Boolean没有默认的构造函数。
映射器:
@Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT,//
uses = { DefaultFactory.class })
public interface MyObjectMapper {
@Mapping(source = "tempObjectDTO", target = "tempObject")
MyObject fromDTO(MyObjectDTO myObjectDTO);
@Mapping(source = "tempObject", target = "tempObjectDTO")
MyObjectDTO toDTO(MyObject myObject);
TempObject fromDTO(TempObjectDTO dto);
TempObjectDTO fromDTO(TempObject tempObject);
String from(String string);
Integer from(Integer integer);
Boolean from(Boolean booleanObject);
}
工厂:
public class DefaultFactory {
public Integer createInteger() {
return new Integer(100);
}
public Boolean createBoolean() {
return new Boolean(true);
}
}