Java Enums : Jackson과 함께 사용하기 위해 Enum을 "동적으로"(클래스 생성자와 비슷 함) 인스턴스화

Shikloshi

이 열거 형이 있습니다.

public enum Role {

Manager("manager"),
Customer("customer");

private String role;

Role(String role){
    this.role = role;
}
}

그리고 나는 Http 요청 (Jerey와 Jackson 사용)에서 얻은 POJO를 가지고 있습니다.

public class UserCredentials {

private String username;
private String password;
private Role role;

public UserCredentials() {
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public Role getRole() {
    return role;
}

public void setRole(Role role) {
    this.role = role;
}
}

마지막 setter는 Jackson이 변환 방법을 실제로 모르기 때문에 오류를 생성합니다.

{
"username": "shikloshi",
"password": "password",
"role": "admin"
}

개체 (특히 "role"Enum)에.

세터를 다음과 같이 변경하려고했습니다.

public void setRole(String role) {
this.role = new Role(role);
}

할 수 없습니다.

더 많은 객체 지향 방식으로 enum 생성자 (또는 다른 생성 방법 (예 : Jackson))를 호출하는 방법이 있습니까 (대안은 setter 내부에서 switch-case를 사용하는 것입니다)?

야노스

이 상황에서 일반적인 해결책 public static Role fromString(String)Role열거 형에 메서드 를 추가하는 것입니다 . 내부적으로 switch, 또는 Map<String, Role>캐시를 사용할 수 있습니다 .

간단한 사용 예 switch:

public static Role fromString(String string) {
    switch (string) {
        case "manager": return Manager;
        case "customer": return Customer;
    }
    throw new IllegalArgumentException("Invalid role: " + string);
}

캐시를 사용하는 예 :

private static Map<String, Role> cache = new HashMap<>();
static {
    for (Role value : values()) {
        cache.put(value.role, value);
    }
}

public static Role fromString(String string) {
    Role role = cache.get(string);
    if (role == null) {
        throw new IllegalArgumentException("Invalid role: " + string);
    }
    return role;
}

사실, 같은 @realskeptic은 당신이 당신의 이름을 변경 한 경우 댓글에서 지적 enum모두 대문자로 값을 MANAGER, CUSTOMER규칙에서 권장하는대로, 당신은 혜택을 누릴 수있는 .valueOf무대 뒤에서 캐시를 사용하는 방법 :

public static Role fromString(String string) {
    return valueOf(string.toUpperCase());
}

이 경우 캐시를 직접 구축하는 것에 대해 걱정할 필요가 없습니다. 유효하지 않은 문자열 값을 제공하면 IllegalArgumentException위의 예와 같이 (약간 다른 텍스트로)이 발생합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관