使用 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 上可用。