Javaその他

ModelMapperを利用してJavaBeanオブジェクトの設定値コピーを行ってみた

今回は、ModelMapperを利用すると、JavaBeanオブジェクト内の同一項目名・同一型のデータに値のコピーができることがわかったので、そのサンプルプログラムを共有する。

前提条件

下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

サンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠のうち、「build.gradle」は今回変更したプログラムで、他は新規で作成したプログラムとなる。

「build.gradle」の内容は以下の通り。lombokとModelMapperを利用できるような設定を追加している。

plugins {
	id 'org.springframework.boot' version '2.1.7.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	//lombokを利用するための設定
	compileOnly 'org.projectlombok:lombok:1.18.10'
	annotationProcessor 'org.projectlombok:lombok:1.18.10'
	//ModelMapperを利用するための設定
	compile 'org.modelmapper:modelmapper:0.7.5'
}



DemoFormオブジェクトの内容は以下の通り。lombokを利用したJavaBeansになっている。

package com.example.demo;

import lombok.Data;

@Data
public class DemoForm {

    /** ID */
    private String id;

    /** 名前 */
    private String name;

    /** 生年月日_年 */
    private String birthYear;

    /** 生年月日_月 */
    private String birthMonth;

    /** 生年月日_日 */
    private String birthDay;

    /** 性別 */
    private String sex;

    /** メモ */
    private String memo;

}



UserDataオブジェクトの内容は以下の通り。lombokを利用したJavaBeansで、DemoFormオブジェクトと同じ項目値と違う項目値をもっている。

package com.example.demo;

import lombok.Data;

@Data
public class UserData {

    /** ID */
    private long id;

    /** 名前 */
    private String name;

    /** 生年月日_年 */
    private int birthY;

    /** 生年月日_月 */
    private int birthM;

    /** 生年月日_日 */
    private int birthD;

    /** 性別 */
    private String sex;

    /** メモ */
    private String memo;

}
「MiniTool Partition Wizard」はパーティション分割・統合・バックアップ・チェックを直感的に行える便利ツールだったハードディスクの記憶領域を論理的に分割し、分割された個々の領域のことを、パーティションといいます。 例えば、以下の図の場合、C/D...

DemoMainクラスの内容は以下の通り。ModelMapperクラスのmodelメソッドで、コピー元のJavaBeanオブジェクトと同一項目名・同一型のデータにのみ、値のコピーが行われる。

package com.example.demo;

import org.modelmapper.ModelMapper;

public class DemoMain {

    public static void main(String[] args){
        // コピー元のJavaBeanオブジェクト(DemoForm)を生成する
        DemoForm demoForm = createDemoForm();
        System.out.println("コピー元のDemoForm : " + demoForm.toString());
        System.out.println();

        // コピー先のJavaBeanオブジェクト(DemoForm)を生成する
        DemoForm demoForm2 = new DemoForm();
        System.out.println("コピー先のDemoForm(コピー前) : " + demoForm2.toString());

        // コピー処理を実施
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.map(demoForm, demoForm2);
        System.out.println("コピー先のDemoForm(コピー後) : " + demoForm2.toString());
        System.out.println();

        // 他のコピー先のオブジェクトにもコピー処理を実施
        // 同一項目名・同一型のデータにのみ、値のコピーが行われる
        UserData userData = new UserData();
        System.out.println("コピー先のUserData(コピー前) : " + userData.toString());
        modelMapper.map(demoForm, userData);
        System.out.println("コピー先のUserData(コピー後) : " + userData.toString());
    }

    // DemoFormオブジェクトを生成
    private static DemoForm createDemoForm(){
        DemoForm demoForm = new DemoForm();
        demoForm.setId("1");
        demoForm.setName("テスト プリン");
        demoForm.setBirthYear("2012");
        demoForm.setBirthMonth("1");
        demoForm.setBirthDay("15");
        demoForm.setSex("2");
        demoForm.setMemo("登録用メモ");
        return demoForm;
    }
}

「DemoMain.java」の実行結果は以下の通りで、コピー元のJavaBeanオブジェクトと同一項目名・同一型のデータにのみ、値のコピーが行われることが確認できる。
サンプルプログラムの実行

要点まとめ

  • ModelMapperクラスのmodelメソッドで、コピー元のJavaBeanオブジェクトと同一項目名・同一型のデータにのみ、値のコピーが行われる。