当前位置: 首页 > 知识库问答 >
问题:

用mapstruct实现值对象的泛型映射

宫亦
2023-03-14

试图在我的业务模型中使用值对象时,我遇到了以下代码的问题:

@Mapper
public abstract class TestMapstruct {

    public ValueObjectA mapA(String value){
        return new ValueObjectA(value);
    }

    public abstract BusinessObject map(DTO dto);

    @Value
    public static class ValueObjectA {
        private String a;
    }

    @Value
    public static class ValueObjectB {
        private String b;
    }

    @Data
    public static class BusinessObject {
        private ValueObjectA a;
        private ValueObjectB b;
    }

    @Data
    public static class DTO {
        private String a;
        private String b;
    }
}

是否有一种通用的方法来声明(string->ValueObject)映射方法?

共有1个答案

鲜于勇
2023-03-14

如果所有方法之间没有公共接口,就没有通用的方法来实现这一点。

但是,如果您有一个公共接口,那么这是可能的。例如:

public interface ValueObject<T> {

    T getValue();

    void setValue(T value);

}

然后您需要一个帮助映射器:

public interface ValueObjectMapper {


    static <V extends ValueObject<T>, T> T mapToValue(V valueObject) {
        return valueObject == null ? null : valueObject.getValue();
    }

    static <V extends ValueObject<T>, T> V mapFromValueObject(T value, @TargetType Class<V> valueObjectClass) {
        if (value == null) {
            return null;
        }


        try {
            V valueObject = valueObjectClass.getDeclaredConstructor().newInstance();
            valueObject.setValue(value);

            return valueObject;
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }

}

如果您希望您的值对象是不可变的,那么您可以执行以下操作:

public interface ValueObject<T> {
    T getValue();
}


public interface ValueObjectMapper {


    static <V extends ValueObject<T>, T> T mapToValue(V valueObject) {
        return valueObject == null ? null : valueObject.getValue();
    }

    static <V extends ValueObject<T>, T> V mapFromValueObject(T value, @TargetType Class<V> valueObjectClass) {
        if (value == null) {
            return null;
        }


        try {
            V valueObject = valueObjectClass.getDeclaredConstructor(value.getClass()).newInstance(value);

            return valueObject;
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }

}

注意:要实现此功能,您必须确保所有ValueObjects都有一个具有该值的构造函数。

 类似资料:
  • 我想将泛型类型<code>Y</code>的对象映射到另一个泛型类型为<code>X</code>的对象。在mapstruct中有这样的功能吗?或者我必须为通用映射编写自定义映射器吗?当我编译上面的代码时,会出现编译错误。

  • 我有一个场景,我必须使用Mapstrt将对象(来自网络请求)转换为对象(数据层)来处理对象映射。我正在尝试创建一个通用的接口,以防止必须为每个资源定义自定义映射器,如下所示: 但这会导致构建错误(但是编译成功): 错误:(13,4)错误:无法为泛型类型变量源生成映射方法。 这不可能吗?如果没有,我将不得不为每个创建一个自定义映射器,并使用根据类类型等告诉反序列化器要使用哪个映射器。。。它可能会变得

  • 我创建映射如下所示。如何将平面dto对象属性(街道、城市等)映射到域对象中的嵌套地址。当我试着去做的时候,我发现了一个错误: [错误]诊断:返回类型中的属性“Address.PostalCode”未知。@Mapping(来源=“City”,目标=“Address.City”), 还有类...

  • 我有很多实体扩展了实体,也有很多数据扩展到 我有一个通用的存储库、服务和映射器,如下所示 我的仓库: 我的服务: 我的地图绘制者: 我想在方法中从T创建一个对象,在类中从方法中从Dto创建一个对象

  • 假设我有这样的映射: 现在,我需要将子列表映射到子列表,但它们都有相同的父对象。我希望这样做: 但不管用,有机会做吗?

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!