我有一个自定义映射函数,它将int
映射到String
,但我只想在一个特殊情况下应用它。但是,它适用于所有int类型的源字段,而不仅仅是用java(…)
注释的源字段。
源类:
class Source {
private int a;
private int b;
// getters etc...
}
目标类别:
class Target {
private String a;
private String b;
// getters etc...
}
映射器:
@Mapping(source="a", target="a") // should not be necessary, but to make it more explicit
@Mapping(target="b", expression = "java(modify(b))")
public abstract Target sourceToTarget(Source source);
String modify(int value) {
return "prefix_" + value;
}
我想要实现的目标:
target.setA(String.valueOf(a));
target.setB(modify(b));
但是,生成的代码会执行以下操作:
target.setA(modify(a));
target.setB(modify(b));
删除表达式并进行修改
时,映射结构对这两个值都使用字符串.valueOf
。我尝试了地图结构1.4.2.最终
以及1.5.2.最终
。这两个类都使用龙目岛,但是,这在过去并不是一个问题。
这种行为是预期的吗?如果是的话,我还能怎么做?
有两种方法可以尝试:
--
@Mapper(componentModel = "spring")
public interface ExampleMapper {
@Mapping(target = "b", expression = "java(modify(source.getB()))")
@Mapping(target = "a", expression = "java(String.valueOf(source.getA()))")
Target sourceToTarget(Source source);
default String modify(int value) {
return "prefix_" + value;
}
}
它生成了以下代码:
@Component
public class ExampleMapperImpl implements ExampleMapper {
@Override
public Target sourceToTarget(Source source) {
if ( source == null ) {
return null;
}
Target target = new Target();
target.setB( modify(source.getB()) );
target.setA( String.valueOf(source.getA()) );
return target;
}
}
--
@Mapper(componentModel = "spring")
public interface ExampleMapper {
@Mapping(source = "a", target = "a")
@Mapping(target = "b", qualifiedByName = "any-name")
Target sourceToTarget(Source source);
@Named("any-name")
default String modify(int value) {
return "prefix_" + value;
}
}
注意:我在< code>modify(int value)方法上使用了< code>@Named,因此它不能被任何映射使用,除非通过< code>qualifiedByName提到。
它生成了以下代码:
@Component
public class ExampleMapperImpl implements ExampleMapper {
@Override
public Target sourceToTarget(Source source) {
if ( source == null ) {
return null;
}
Target target = new Target();
target.setA( String.valueOf( source.getA() ) );
target.setB( modify(source.getB()) );
return target;
}
}
以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。
例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?
我有一个映射定义为 其中定义如下: 反向映射是使用处理的。如何为反向映射指定自定义映射?
我试图找到一个更好的解决方案,以防止Hibernate代理初始化时,通过MapSTRt将实体映射到响应DTO。 我一直在将我们的代码库转换为使用ModelMapper中的MapStruct。如果我想用ModelMapper完成我的要求,我可以做如下简单的事情: 自定义getter方法允许我检查是否已经从数据库中获取了字段,以避免N 1次初始化。 它看起来像: 我不能简单地覆盖普通的getter,因
怎么做?没有找到可以基于类型动态映射的示例。我发现这种方法在、Google中都非常方便。感谢你的帮助!
假设我有这些实体: null