使用 MapStruct 為枚舉的意外輸入拋出異常
一、概述
在本教程中,我們將了解如何使用 MapStruct 將一個enum的值映射到另一個enum的值。我們還將學習如何在另一個enum中沒有對應值時拋出Exception 。
2. MapStruct 庫
MapStruct 是一種代碼生成工具,可簡化 Java Beans 映射。最新版本的 MapStruct 庫可以在Maven Central Repository中找到。
讓我們將依賴項添加到我們的pom.xml :
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
此外,我們需要將annotationProcessorPaths添加到maven-compiler-plugin插件中,以便在項目的target文件夾中自動生成方法:
<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</artifactId>
<version>1.5.5.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
三、問題介紹
首先,讓我們創建源enum 。我們將其命名為InputLevel ,它將具有三個可能的值: HIGH 、 MEDIUM和LOW :
enum InputLevel {
LOW, MEDIUM, HIGH
}
我們現在可以添加目標enum 。這個只包含兩個值HIGH和LOW :
enum OutputLevel {
LOW, HIGH
}
我們的目標是將InputLevel轉換為OutputLevel 。例如,輸入InputLevel.LOW給我們OutputLevel.LOW 。但是,沒有MEDIUM的匹配值。因此,我們想在這種情況下拋出Exception 。
4. Source沒有對應的Target時拋出
我們將使用Mapper註釋並創建一個映射器接口。**從 MapStruct 庫的 1.5.0.Beta1 版本開始,我們可以使用@ValueMapping**註解來實現我們的目標:
@Mapper
interface LevelMapper {
@ValueMapping(source = MappingConstants.ANY_REMAINING, target = MappingConstants.THROW_EXCEPTION)
OutputLevel inputLevelToOutputLevel(InputLevel inputLevel);
}
如我們所見,我們配置了註釋,以便在沒有相應目標的情況下映射源中的任何值都會導致Exception 。
現在讓我們快速檢查該方法在給定InputLevel.HIGH時是否正確返回OutputLevel.HIGH :
LevelMapper levelMapper = Mappers.getMapper(LevelMapper.class);
@Test
void givenHighInputLevel_WhenInputLevelToOutputLevel_ThenHighOutputLevel() {
assertEquals(OutputLevel.HIGH, levelMapper.inputLevelToOutputLevel(InputLevel.HIGH));
}
最後,我們將確認當我們嘗試將InputLevel.MEDIUM轉換為OutputLevel,會拋出Exception 。具體來說,它拋出一個IllegalArgumentException :
@Test
void givenMediumInputLevel_WhenInputLevelToOutputLevel_ThenThrows() {
assertThrows(IllegalArgumentException.class, () -> levelMapper.inputLevelToOutputLevel(InputLevel.MEDIUM));
}
5.結論
在本文中,我們使用 MapStruct 庫將值從源enum映射到目標enum 。此外,如果源值在目標enum中沒有匹配項,我們將映射器配置為拋出Exception 。
與往常一樣,代碼在 GitHub 上可用。