web-dev-qa-db-ja.com

MapStruct:2つのオブジェクトを3番目のオブジェクトにマッピングする

Object1とObject2があります。ここで、1と2の属性を使用してobject3をマップします。

たとえば、2つのオブジェクトがあります。

_1. User: {first_name, last_name, id}
2. Address: {street, locality, city, state, pin, id}
_

さて、これらで、私はそれをマッピングしたいと思います

_User_View: {firstName, lastName, city, state}.
_

ここで、first_nameとlast_nameはUserオブジェクトから、cityとstateはAddressオブジェクトからのものになります。

今、私の質問は、それをどのように行うのですか?

しかし、現在、私はこのようにやっています

_@Mapper    
public abstract class UserViewMapper {
        @Mappings({
                    @Mapping(source = "first_name", target = "firstName"),
                    @Mapping(source = "last_name", target = "lastName"),
                    @Mapping(target = "city", ignore = true),
                    @Mapping(target = "state", ignore = true)

            })
            public abstract UserView userToView(User user);

        public UserView addressToView(UserView userView, Address address) {

                if (userView == null) {
                    return null;
                }

                if (address == null) {
                    return null;
                }

                userView.setCity(address.getCity());
                userView.setState(address.getState()); 

            return userView;

            }
    }
_

しかし、ここでは、addressToView()に手動でマッピングを作成する必要があります。

したがって、それを回避する方法はありますか?

または、そのような状況を処理するための好ましい方法は何ですか?

10
anij

いくつかのソースパラメータを使用してマッピングメソッドを宣言し、@Mappingアノテーションでこれらすべてのパラメータのプロパティを参照できます。

@Mapper
public abstract class UserViewMapper {

    @Mapping(source = "first_name", target = "user.firstName"),
    @Mapping(source = "last_name", target = "user.lastName"),
    public abstract UserView userAndAddressToView(User user, Address address);
}

「city」プロパティ名と「state」プロパティ名はソースとターゲットで一致するため、それらをマッピングする必要はありません。

詳細については、リファレンスドキュメントの "マッパーの定義" の章も参照してください。

12
Gunnar

MapStructを使用すると、@ Mapperアノテーションを使用したステップが欠落します。 @Mapperは、マッピングの実装を作成します。

このリンクでドキュメントを確認する必要があります http://mapstruct.org/documentation/stable/reference/html/

具体的には

  1. マッパーの定義

このセクションでは、MapStructを使用してBeanマッパーを定義する方法と、そのために必要なオプションについて学習します。 3.1基本的なマッピング

マッパーを作成するには、必要なマッピングメソッドを使用してJavaインターフェイスを定義し、org.mapstruct.Mapperアノテーションを付けます。

@Mapper
public interface CarMapper {

    @Mappings({
        @Mapping(source = "make", target = "manufacturer"),
        @Mapping(source = "numberOfSeats", target = "seatCount")
    })
    CarDto carToCarDto(Car car);

    @Mapping(source = "name", target = "fullName")
    PersonDto personToPersonDto(Person person);
}

@Mapperアノテーションにより、MapStructコードジェネレーターはビルド時にCarMapperインターフェイスの実装を作成します。

0
Mike Murphy