使用 mapstruct 从字符串到枚举
From string to enum using mapstruct
我想使用 mapstruct 将字符串转换为枚举
enum TestEnum {
NO("no");
String code;
TestEnum(String code) {
this.code = code
}
public String getCode() {
return code;
}
}
我有一个从服务中获得的代码,我想将此代码转换为 Enum 如何通过 mapstruct 以更简单的方式完成此操作
这是一个带有抽象映射器的解决方案,但如果您愿意,可以使用默认方法或 class
对其进行转换
@Mapper
public abstract class TestMapper {
abstract Source toSource(Target target);
abstract Target totarget(Source source);
String toString(TestEnum test){
return test.getCode();
}
TestEnum toEnum(String code){
for (TestEnum testEnum : TestEnum.values()) {
if(testEnum.equals(code)){
return testEnum;
}
}
return null;
}
}
public class Source {
String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
public class Target {
TestEnum value;
public TestEnum getValue() {
return value;
}
public void setValue(TestEnum value) {
this.value = value;
}
}
以下代码对我有用。
@Mappings({
@Mapping(source = "genderDTO.name", target = "genderName")
})
GenderRecord dtoTogenderRecord(GenderDTO genderDTO);
- "genderName" 是枚举
- "genderDTO.name" 是字符串
结果是:
@Override
public GenderRecord dtoTogenderRecord(GenderDTO genderDTO) {
if ( genderDTO == null ) {
return null;
}
GenderRecord genderRecord = new GenderRecord();
if ( genderDTO.getName() != null ) {
genderRecord.setGenderName( Enum.valueOf( GenderType.class, genderDTO.getName() ) );
}
return genderRecord;
}
我还在接口级别使用以下内容来确保空检查:
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
MapStruct 仅调用 "setProperty(PropertyType)" 函数,因此只需在您的 setter 中使用多态性
对于 DTO:
public void setStatus(String status) {
this.status = status;
}
public void setStatus(ProjectStatus status) {
this.status = status.toString();
}
对于实体:
public void setStatus(ProjectStatus status) {
this.status = status;
}
public void setStatus(String status) {
switch (status) {
case "PENDING_WITH_RM":
this.status = ProjectStatus.PENDING;
break;
case "PENDING_WITH_OPS":
this.status = ProjectStatus.PENDING;
break;
case "COMPLETED":
this.status = ProjectStatus.COMPLETED;
break;
default:
this.status = ProjectStatus.DRAFT;
}
}
我想使用 mapstruct 将字符串转换为枚举
enum TestEnum {
NO("no");
String code;
TestEnum(String code) {
this.code = code
}
public String getCode() {
return code;
}
}
我有一个从服务中获得的代码,我想将此代码转换为 Enum 如何通过 mapstruct 以更简单的方式完成此操作
这是一个带有抽象映射器的解决方案,但如果您愿意,可以使用默认方法或 class
对其进行转换@Mapper
public abstract class TestMapper {
abstract Source toSource(Target target);
abstract Target totarget(Source source);
String toString(TestEnum test){
return test.getCode();
}
TestEnum toEnum(String code){
for (TestEnum testEnum : TestEnum.values()) {
if(testEnum.equals(code)){
return testEnum;
}
}
return null;
}
}
public class Source {
String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
public class Target {
TestEnum value;
public TestEnum getValue() {
return value;
}
public void setValue(TestEnum value) {
this.value = value;
}
}
以下代码对我有用。
@Mappings({
@Mapping(source = "genderDTO.name", target = "genderName")
})
GenderRecord dtoTogenderRecord(GenderDTO genderDTO);
- "genderName" 是枚举
- "genderDTO.name" 是字符串
结果是:
@Override
public GenderRecord dtoTogenderRecord(GenderDTO genderDTO) {
if ( genderDTO == null ) {
return null;
}
GenderRecord genderRecord = new GenderRecord();
if ( genderDTO.getName() != null ) {
genderRecord.setGenderName( Enum.valueOf( GenderType.class, genderDTO.getName() ) );
}
return genderRecord;
}
我还在接口级别使用以下内容来确保空检查:
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
MapStruct 仅调用 "setProperty(PropertyType)" 函数,因此只需在您的 setter 中使用多态性
对于 DTO:
public void setStatus(String status) {
this.status = status;
}
public void setStatus(ProjectStatus status) {
this.status = status.toString();
}
对于实体:
public void setStatus(ProjectStatus status) {
this.status = status;
}
public void setStatus(String status) {
switch (status) {
case "PENDING_WITH_RM":
this.status = ProjectStatus.PENDING;
break;
case "PENDING_WITH_OPS":
this.status = ProjectStatus.PENDING;
break;
case "COMPLETED":
this.status = ProjectStatus.COMPLETED;
break;
default:
this.status = ProjectStatus.DRAFT;
}
}