SpringとJPAに基づくWebアプリケーション開発#35 ModelMapper

16098 ワード

SpringとJPAに基づくWebアプリケーション開発#35 ModelMapper
これらはインフラストラクチャ、Spring、JPAベースのWebアプリケーション開発のコースに基づいて作成されています.

要約は、学習コース、要約ソースのタグ付け、ブログまたはドキュメント形式で公開できるようにする原則の下で公開されます.出典は前述の通り、インフラストラクチャ、Spring、JPAベースのWebアプリケーション開発.
私が勉強しているソースコードはhttps://github.com/n00nietzsche/jakestudy_webappにアップロードされます.私は伝言ごとに講義のどの部分を記録します.

ModelMapperの適用

  • http://modelmapper.org/
  • オブジェクトの輪郭を他のオブジェクトの輪郭にマッピングするユーティリティ
  • .
  • 依存性
  • を追加
    <dependency>
      <groupId>org.modelmapper</groupId>
      <artifactId>modelmapper</artifactId>
      <version>2.3.6</version>
    </dependency>
  • チャット年齢設定
  • modelMapper.getConfiguration()
      .setSourceNameTokenizer(NameTokenizer.UNDERSCORE)
      .setDestinationNameTokenizer(NameTokenizer.UNDERSCORE)
  • 2UNDERSCORE()を使用している場合にのみ、ネストされたオブジェクトを参照しているとみなされます.そうしないと、オブジェクトの直接propertyにバインドされます.
  • http://modelmapper.org/user-manual/configuration/#matching-strategies
  • ModelMapperでの質問


    ネストされている場合は,どのようにカットや読み取りを行うかなどの主観的な決定はできない.
    デフォルトはNamingConventions.NONEで、命名規則なしですべてのプログラム名に適用されます.
    たとえば、NotificationsFormの内部にisStudyCreatedByEmailというフィールドがあります.このとき、ModelMapperは、Studyという内部クラスのCreatedByEmailというフィールドを探しているかどうか分からないことを示す.このため、account.setEmail()を入れるデータを選択すると、複数の候補地が出現するエラーが発生した.
        @Bean
        public ModelMapper modelMapper() {
            ModelMapper modelMapper = new ModelMapper();
            modelMapper.getConfiguration()
                    .setDestinationNameTokenizer(NameTokenizers.UNDERSCORE)
                    .setSourceNameTokenizer(NameTokenizers.UNDERSCORE);
    
            return modelMapper;
        }
    前述したように、UNDERSCORE(_)でなければ、名前がどのように書かれていても、名前全体がプログラム名として扱われます.ネストされた表示をしたい場合は、構成で設定したようにUNDERSCOREを使用できます.

    ModelMapper依存性の追加

            <!-- 모델 맵퍼 -->
            <dependency>
                <groupId>org.modelmapper</groupId>
                <artifactId>modelmapper</artifactId>
                <version>2.3.6</version>
            </dependency>

    ModelMapper Bean登録

        @Bean
        public ModelMapper modelMapper() {
            ModelMapper modelMapper = new ModelMapper();
            modelMapper.getConfiguration()
                    .setDestinationNameTokenizer(NameTokenizers.UNDERSCORE)
                    .setSourceNameTokenizer(NameTokenizers.UNDERSCORE);
    
            return modelMapper;
        }
    どうせずっと生成されているわけではないので、登録が空いていれば便利です..setDestinationNameTokenizer()メソッドでは、UNDERSCOREの場合のみチャット年齢を設定し、ネストされたpropertyを指定するには、_を使用すればよい.CamelCaseがネストされたPropertyを指すという誤解から解放される.

    ModelMapperの使用


    CASE 1:インスタンス化されたマッピング


    受精前

        public void updateProfile(Account account, Profile profile) {
            account.setUrl(profile.getUrl());
            account.setBio(profile.getBio());
            account.setLocation(profile.getLocation());
            account.setOccupation(profile.getOccupation());
            // TODO: 프로필 이미지
            account.setProfileImage(profile.getProfileImage());
            // TODO: 중요한 문제가 하나 더 남았다.
        }

    変更後

    public void updateProfile(Account account, ProfileForm profileForm) {
            // from Source to Destination 로 데이터를 전달해줌
            // 프로퍼티의 이름이 일치한다는 가정 하에서 쓰는 것임
            // 대량의 Setter 를 발생시킨다.
            modelMapper.map(profileForm, account);
        }
    最初のパラメータにsourceを簡単に、2番目のパラメータにdestinationを与えます.内部に大量のsetterが生成され、property名に一致する部分がそのまま移動します.

    CASE 2:インスタンスマッピングなし


    受精前

    model.addAttribute(new ProfileForm(loginAccount));
    
        public ProfileForm(Account account) {
            this.bio = account.getBio();
            this.url = account.getUrl();
            this.occupation = account.getOccupation();
            this.location = account.getLocation();
            this.profileImage = account.getProfileImage();
        }

    変更後

    model.addAttribute(modelMapper.map(loginAccount, ProfileForm.class));
    클래스명.classを使用してクラス情報自体を入れると、戻り値がクラスのオブジェクトになります.