1概要

このチュートリアルでは、http://jmapper-framework.github.io/jmapper-core/[JMapper] –

速くて使いやすいマッピングフレームワークを探ります

JMapperを設定するさまざまな方法、カスタム変換を実行する方法、およびリレーショナルマッピングについて説明します。


2 Mavenの設定

まず、https://search.maven.org/classic/#search%7Cga%7C1%7Cjmapper-core[JMapper依存関係]を

pom.xml

に追加する必要があります。

<dependency>
    <groupId>com.googlecode.jmapper-framework</groupId>
    <artifactId>jmapper-core</artifactId>
    <version>1.6.0.1</version>
</dependency>


3転送元と転送先のモデル

設定を始める前に、このチュートリアルを通して使用する単純なBeanを見てみましょう。

まず、これが私たちのソースBeanです。

public class User {
    private long id;
    private String email;
    private LocalDate birthDate;
}

そして私たちの送り先のビーン、

UserDto:

public class UserDto {
    private long id;
    private String username;
}

  • ライブラリを使用して、ソースBean

    User

    から宛先Bean

    UserDto

    に属性をマッピングします。

JMapperを構成するには3つの方法があります。それは、API、アノテーション、およびXML構成を使用することです。

次のセクションでは、これらのそれぞれについて説明します。


4 APIを使用する

APIを使用して

JMapper

を設定する方法を見てみましょう。

ここでは、送信元クラスと宛先クラスに設定を追加する必要はありません。代わりに、

__

JMapperAPI ** を使用してすべての設定を行うことができます。これにより、最も柔軟な設定方法になります。

@Test
public void givenUser__whenUseApi__thenConverted(){
    JMapperAPI jmapperApi = new JMapperAPI()
      .add(mappedClass(UserDto.class)
        .add(attribute("id").value("id"))
        .add(attribute("username").value("email")));

    JMapper<UserDto, User> userMapper = new JMapper<>
      (UserDto.class, User.class, jmapperApi);
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getUsername());
}

ここでは、

mappedClass()

メソッドを使用してマッピングクラス

UserDtoを定義します。次に、

attribute()__メソッドを使用して各属性とそのマッピング値を定義します。

次に、設定に基づいて

JMapper

オブジェクトを作成し、その

getDestination()メソッドを使用して

UserDto__結果を取得しました。


5注釈を使う


  • @ JMap

    アノテーションを使ってマッピングを設定する方法を見てみましょう。

public class UserDto {
    @JMap
    private long id;

    @JMap("email")
    private String username;
}

そして、これが私たちの

JMapper

の使い方です。

@Test
public void givenUser__whenUseAnnotation__thenConverted(){
    JMapper<UserDto, User> userMapper = new JMapper<>(UserDto.class, User.class);
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getUsername());
}


id

属性には、ソースBeanと同じ名前であるためターゲットフィールド名を指定する必要はありませんでしたが、

username

フィールドには

User

クラスの

email

フィールドに対応することを説明しました。

その後、

送信元Beanと送信先Beanを

JMapper


に渡すだけで済み、それ以上の設定は必要ありません。

全体として、この方法は、使用するコード量が最も少ないので便利です。


6. XML設定を使用する

XML構成を使用してマッピングを定義することもできます。

これが

user

jmapper.xml__のサンプルXML設定です。

<jmapper>
  <class name="com.baeldung.jmapper.UserDto">
    <attribute name="id">
      <value name="id"/>
    </attribute>
    <attribute name="username">
      <value name="email"/>
    </attribute>
  </class>
</jmapper>

そしてXML設定を

JMapper

に渡す必要があります。

@Test
public void givenUser__whenUseXml__thenConverted(){
    JMapper<UserDto, User> userMapper = new JMapper<>
      (UserDto.class, User.class,"user__jmapper.xml");
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getUsername());
}

XML設定をファイル名の代わりに

String

として直接

JMapper

に渡すこともできます。


7. グローバルマッピング

ソースBeanと宛先Beanの両方に同じ名前のフィールドが複数ある場合は、グローバルマッピングを利用できます。

たとえば、

id



email

の2つのフィールドを持つ

UserDto1

があるとします。

public class UserDto1 {
    private long id;
    private String email;

   //standard constructor, getters, setters
}

グローバルマッピングは

User

source beanの同じ名前のフィールドにマッピングされているので使いやすいでしょう。


7.1. APIを使用する


JMapperAPI

設定には、

global()

を使用します。

@Test
public void givenUser__whenUseApiGlobal__thenConverted() {
    JMapperAPI jmapperApi = new JMapperAPI()
      .add(mappedClass(UserDto.class).add(global())) ;
    JMapper<UserDto1, User> userMapper1 = new JMapper<>
      (UserDto1.class, User.class,jmapperApi);
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto1 result = userMapper1.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getEmail());
}


7.2. 注釈を使う

アノテーション設定には、クラスレベルで

@ JGlobalMap

を使用します。

@JGlobalMap
public class UserDto1 {
    private long id;
    private String email;
}

これが簡単なテストです。

@Test
public void whenUseGlobalMapAnnotation__thenConverted(){
    JMapper<UserDto1, User> userMapper= new JMapper<>(
      UserDto1.class, User.class);
    User user = new User(
      1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto1 result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getEmail());
}


7.3. XML設定

そしてXML設定のために、

<global/>

要素があります。

<jmapper>
  <class name="com.baeldung.jmapper.UserDto1">
    <global/>
  </class>
</jmapper>

そしてXMLファイル名を渡します。

@Test
public void givenUser__whenUseXmlGlobal__thenConverted(){
    JMapper<UserDto1, User> userMapper = new JMapper<>
      (UserDto1.class, User.class,"user__jmapper1.xml");
    User user = new User(1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto1 result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getEmail());
}


8カスタムコンバージョン

それでは、

JMapper

を使用してカスタム変換を適用する方法を見てみましょう。


UserDto

に新しいフィールド

age

があります。これは

User


birthDate

属性から計算する必要があります。

public class UserDto {
    @JMap
    private long id;

    @JMap("email")
    private String username;

    @JMap("birthDate")
    private int age;

    @JMapConversion(from={"birthDate"}, to={"age"})
    public int conversion(LocalDate birthDate){
        return Period.between(birthDate, LocalDate.now())
          .getYears();
    }
}

そのため、**

ユーザーのbirthDate

から

UserDtoの

age

属性への複雑な変換を適用するために

@ JMapConversion

を使用しました。そのため、

age

フィールドは、

User



UserDto__にマッピングしたときに計算されます。

@Test
public void whenUseAnnotationExplicitConversion__thenConverted(){
    JMapper<UserDto, User> userMapper = new JMapper<>(
      UserDto.class, User.class);
    User user = new User(
      1L,"[email protected]", LocalDate.of(1980,8,20));
    UserDto result = userMapper.getDestination(user);

    assertEquals(user.getId(), result.getId());
    assertEquals(user.getEmail(), result.getUsername());
    assertTrue(result.getAge() > 0);
}


9リレーショナルマッピング

最後に、リレーショナルマッピングについて説明します。 ** この方法では、毎回ターゲットクラスを使って

JMapper

を定義する必要があります。

ターゲットクラスをすでに知っている場合は、マップされた各フィールドに対してそれらを定義し、

RelationalJMapper

を使用できます。

この例では、1つのソースBean

User

があります。

public class User {
    private long id;
    private String email;
}

そして2つの宛先Bean

UserDto1

:

public class UserDto1 {
    private long id;
    private String username;
}

そして

UserDto2

:

public class UserDto2 {
    private long id;
    private String email;
}

__RelationalJMapperを利用する方法を見てみましょう。


9.1. APIを使用する

私たちのAPI設定のために、

targetClasses()

を使って各属性のためのターゲットクラスを定義することができます:

@Test
public void givenUser__whenUseApi__thenConverted(){
    JMapperAPI jmapperApi = new JMapperAPI()
      .add(mappedClass(User.class)
      .add(attribute("id")
        .value("id")
        .targetClasses(UserDto1.class,UserDto2.class))
      .add(attribute("email")
        .targetAttributes("username","email")
        .targetClasses(UserDto1.class,UserDto2.class)));

    RelationalJMapper<User> relationalMapper = new RelationalJMapper<>
      (User.class,jmapperApi);
    User user = new User(1L,"[email protected]");
    UserDto1 result1 = relationalMapper
      .oneToMany(UserDto1.class, user);
    UserDto2 result2 = relationalMapper
      .oneToMany(UserDto2.class, user);

    assertEquals(user.getId(), result1.getId());
    assertEquals(user.getEmail(), result1.getUsername());
    assertEquals(user.getId(), result2.getId());
    assertEquals(user.getEmail(), result2.getEmail());
}

ターゲットクラスごとに、ターゲット属性名を定義する必要があります。


RelationalJMapper

は1つのクラス – マッピングされたクラスのみを取ります。


9.2. 注釈を使う

アノテーションアプローチのために、

classes

も定義します。

public class User {
    @JMap(classes = {UserDto1.class, UserDto2.class})
    private long id;

    @JMap(
      attributes = {"username", "email"},
      classes = {UserDto1.class, UserDto2.class})
    private String email;
}

いつものように、アノテーションを使うときそれ以上の設定は必要ありません:

@Test
public void givenUser__whenUseAnnotation__thenConverted(){
    RelationalJMapper<User> relationalMapper
      = new RelationalJMapper<>(User.class);
    User user = new User(1L,"[email protected]");
    UserDto1 result1 = relationalMapper
      .oneToMany(UserDto1.class, user);
    UserDto2 result2= relationalMapper
      .oneToMany(UserDto2.class, user);

    assertEquals(user.getId(), result1.getId());
    assertEquals(user.getEmail(), result1.getUsername());
    assertEquals(user.getId(), result2.getId());
    assertEquals(user.getEmail(), result2.getEmail());
}


9.3. XML設定

XML構成では、

<classes>

を使用して各属性のターゲットクラスを定義します。

これが

user

jmapper2.xmlです。

<jmapper>
  <class name="com.baeldung.jmapper.relational.User">
    <attribute name="id">
      <value name="id"/>
      <classes>
        <class name="com.baeldung.jmapper.relational.UserDto1"/>
        <class name="com.baeldung.jmapper.relational.UserDto2"/>
      </classes>
    </attribute>
    <attribute name="email">
      <attributes>
        <attribute name="username"/>
        <attribute name="email"/>
      </attributes>
      <classes>
        <class name="com.baeldung.jmapper.relational.UserDto1"/>
        <class name="com.baeldung.jmapper.relational.UserDto2"/>
      </classes>
    </attribute>
  </class>
</jmapper>

そしてXML設定ファイルを

RelationalJMapper

に渡します。

@Test
public void givenUser__whenUseXml__thenConverted(){
    RelationalJMapper<User> relationalMapper
     = new RelationalJMapper<>(User.class,"user__jmapper2.xml");
    User user = new User(1L,"[email protected]");
    UserDto1 result1 = relationalMapper
      .oneToMany(UserDto1.class, user);
    UserDto2 result2 = relationalMapper
      .oneToMany(UserDto2.class, user);

    assertEquals(user.getId(), result1.getId());
    assertEquals(user.getEmail(), result1.getUsername());
    assertEquals(user.getId(), result2.getId());
    assertEquals(user.getEmail(), result2.getEmail());
}


10結論

このチュートリアルでは、JMapperを設定するさまざまな方法とカスタム変換を実行する方法を学びました。

例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/libraries-data[GitHubに掲載]を参照してください。