web-dev-qa-db-ja.com

mapstructを使用して文字列から列挙型に

Mapstructを使用して文字列を列挙型に変換したい

enum TestEnum {
   NO("no");
   String code;

   TestEnum(String code) {
     this.code = code
   }

   public String getCode() {
    return code;
   }
}

サービスから取得したコードがあり、このコードをEnumに変換する方法

5
m.zemlyanoi

これは抽象マッパーを使用したソリューションですが、必要に応じてデフォルトのメソッドまたはクラスを使用して変換できます

@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;
    }
}
3
Bertrand Cedric

次のコードは私のために働いた。

@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;
}

また、インターフェイスレベルで次のコードを使用してnullチェックを確認します。

@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
2
jpCharger

MapStructは「setProperty(PropertyType)」関数を呼び出すだけなので、セッターでポリモーフィズムを使用します

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;
        }
    }
1
Ryan Augustine

多くの場合、可能なコードと列挙型識別子の間の変換があります:

enum TestEnum {
   NO("no"),
   _42("42"),
   MAYBE_YES("maybe yes");

   public final String code;

   public static TestEnum fromCode(String c) {
       c = c.toUpperCase().replace(' ', '_'); // Space to underscore.
       if (c.matches("\\d.*")) {
           c = "_" + c; // Starting digit prefixed by underscore.
       }
       return TestEnum.valueOf(c);
   }

   TestEnum(String code) {
     this.code = code
   }

   public String getCode() {
    return code;
   }
}

フィールドcodeは不要になりました。

0
Joop Eggen