MapStruct本体間変換の簡単な使い方


要旨:実際のプロジェクトでは、POをDTM、DTXからPOに切り替えるなど、実体間の変換が常に必要です。有名なのはBenUtilやModelMapperなど、使い勝手は簡単ですが、やや複雑なビジネスシーンでは力不足です。MapStructというプラグインは、dominエンティティ類とmodel類の属性マッピングを処理するために使用でき、配置性が高い。
Mavenプロジェクトを立ち上げる
MapStructは目立つ構築ツール(Mavenなど)のサポートが必要であり、プロジェクト構造が標準でないと対応する変換クラスが生成できない場合があります。ここはMavenを使って建設工事をします。

<properties>
<org.mapstruct.version>1.2.0.CR1</org.mapstruct.version>
</properties>
MapStructはずっと進歩しているツールで、後のバージョンは絶えず前のバージョンの不足を改善して、前のバージョンのbugを修復して、使う時最も良い最新の安定版。

<dependencies>
  <dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>${org.mapstruct.version}</version>
  </dependency>
</dependencies>
導入したい依頼のカバンは、java 8に使用され、最新版ではjava 9をサポートしていることも見られます。もちろんこれはあなたがjava 8を使用しなければならないとは思いません。javaバージョンはjava 6よりも高いです。

<build>
  <plugins>
    <plugin>
<groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.5.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <annotationProcessorPaths>
          <path>
  <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
        <version>${org.mapstruct.version}</version>
          </path>
        </annotationProcessorPaths>
      </configuration>
    </plugin>
  </plugins>
</build>
Mavenプラグインは欠かせません。フォーマットも固定されています。
簡単な例
エンティティクラスがあります。ユーザUser

public class User {
  private int id;
  private String name;
  private boolean married;
// setters, getters, toString
}
実体クラスがあります。従業員はEmployeeで、従業員もユーザーです。ただ、ユーザーより一つ多い属性-職位positionです。

public class Employee {
  private int id;
  private String name;
  private String position;
  private boolean married;
// setters, getters, toString
}
具体的なビジネスシーンでは、UserオブジェクトをEmployeeオブジェクトに変換する必要があり、場合によってはEmployeeオブジェクトをUserオブジェクトに変換する必要があります。
MapStrutを使うには、インターフェースを書く必要があります。

@Mapper
public interface UserMapper {
  UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
  Employee userToEmployee(User user);
  User employeeToUser(Employee employee);
}
実行例
まずmvn compileが必要です。自動的に変換コードを生成します。生成されたコードはtarget/annotationsの下に置かれる。大体のコードは以下の通りです。

import com.training.mapstrut.model.Employee;
import com.training.mapstrut.model.User;
import javax.annotation.Generated;
@Generated(
  value = "org.mapstruct.ap.MappingProcessor",
  date = "2017-08-26T17:08:23+0800",
  comments = "version: 1.2.0.CR1, compiler: javac, environment: Java 1.8.0_92 (Oracle Corporation)"
)
public class UserMapperImpl implements UserMapper {
  @Override
  public Employee userToEmployee(User user) {
    if ( user == null ) {
      return null;
    }
    Employee employee = new Employee();
    employee.setId( user.getId() );
    employee.setName( user.getName() );
    employee.setMarried( user.isMarried() );
    return employee;
  }
  @Override
  public User employeeToUser(Employee employee) {
    if ( employee == null ) {
      return null;
    }
    User user = new User();
    user.setId( employee.getId() );
    user.setName( employee.getName() );
    user.setMarried( employee.isMarried() );
    return user;
  }
}
簡単にテスト種類を書いて実験してみます。

public class AppTest{
  @Test
  public void appTest(){
    User user = new User();
    user.setId(125);
    user.setName("Chao");
    user.setMarried(false);
    Employee e = UserMapper.INSTANCE.userToEmployee(user);
    System.out.println(e);
    Assert.assertFalse(e.isMarried());
  }
}
結果出力:
Employee[id=125,name=Choo,position=null,maried=false]
効果は悪くないです。変換が必要なフィールドは正確で間違いないですが、吐きそうな人がいます。このような使い方はBeanUtilより複雑で、同じ効果を達成するだけです。このような簡単な転化はMapStructを必要としません。もっと複雑なビジネスシーンを作るべきです。
MapStruct問題
1.MapStruct変換が正確ではない。
MapStructはずっと更新していますが、いくつかの特性は旧版では認識できません。使う時は最新バージョンを一番使います。
2.Eclipseの下で、M 2 E plug-i-nのサポートが必要です。もしEclipseに統合されていないなら、Eclipse Marketplaceにインストールをダウンロードしたいです。また、下の構成をpom.xmlのpropertiesに指定してAnnotation Processingを有効にする必要があります。<m2e.apt.activation>jdt_apt</m2e.apt.activation>3.Eclipseの下で、Maven compleはNothing to compile - all classes are up to dateを提示します。Goldsにclean install compileを記入してみてもいいです。
4.Mavenコンパイルの場合は、JDKを使用しなければなりません。JREは使用できません。バージョンはjdk 6より高いです。
5.Eclipseでは、*MapperImpl.javaが生成されたと確定しましたが、時報エラーClassNotFoundException: Cannot find implementation for com...*Mapper
は、プロジェクト上で右キーC>properties C>Java Compler C>Annotation Processing(Enbaleのすべての項目)C>Factory Path(Enbale)C>Add External JARS'は、おそらく45914のディレクトリを選択します。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。