MapStructカスタムする
※ こちら現在調査中
MappingExclusionProviderを使用することで、特定のフィールドへのマッピングを無視することができます
MappingExclusionProviderは、MapStructに対して特定のフィールドを無視するように指示するためのカスタムプロバイダを実装するためのインターフェースです
1. CustomMappingExclusionProviderの実装
特定のフィールドを無視するカスタムプロバイダを作成します
import org.mapstruct.ap.spi.MappingExclusionProvider;
import javax.lang.model.element.Element;
public class CustomMappingExclusionProvider implements MappingExclusionProvider {
@Override
public boolean isExcluded(TypeElement element) {
// フィールド名が "customMethod" の場合は無視
// ※ 特定のフィールドは難しい。。。
return element.getSimpleName().toString().equals("customMethod");
}
}
2. META-INF/servicesディレクトリに設定ファイルを作成
次に、META-INF/servicesディレクトリにorg.mapstruct.ap.spi.MappingExclusionProviderというファイルを作成し、カスタムプロバイダの完全修飾名を記述します
ディレクトリとファイルの作成
プロジェクトのsrc/main/resources/META-INF/services
ディレクトリに以下のファイルを作成します
src/main/resources/META-INF/services/org.mapstruct.ap.spi.MappingExclusionProvider
ファイルの内容
ファイルの内容にはカスタムプロバイダの完全修飾名を記述します
com.example.CustomMappingExclusionProvider
3. build.gradleファイルの設定
plugins {
id 'java'
id 'eclipse' // Optional: for Eclipse integration
id 'idea' // Optional: for IntelliJ IDEA integration
}
group 'com.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.mapstruct:mapstruct:1.5.5.Final' // 最新バージョンを指定してください
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
compileOnly 'org.projectlombok:lombok:1.18.24' // Optional: if you're using Lombok
annotationProcessor 'org.projectlombok:lombok:1.18.24' // Optional: if you're using Lombok
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
tasks.withType(JavaCompile) {
options.annotationProcessorPath = configurations.annotationProcessor
options.compilerArgs << "-Amapstruct.defaultComponentModel=spring" // Optional: if you're using Spring
}
【補足】
META-INF/servicesディレクトリに設定ファイルを作成するのは、MappingExclusionProviderのようなSPI(サービスプロバイダインターフェース)を登録する標準的な方法です
これにより、MapStructがカスタムMappingExclusionProviderを認識して使用できるようになります
是非フォローしてください
最新の情報をお伝えします