PathVariable을 Enum타입으로 받을시 @InitBinder을 사용하여 name이 아닌 원하는 필드로 체크하기

Created:

@PathVariable을 Enum타입으로 받을시 name이 아닌 원하는 필드로 체크하고자 한다.

아래는 받고자 하는 타입의 Enum 코드와 요청 들어오는 Controller쪽 코드이다.

@AllArgsConstructor
public enum LinkTargetType {

    BLANK("_blank"),
    SELF("_self"),
    PARENT("_parent"),
    TOP("_top");

    private String value;

    public static LinkTargetType fromValue(String value) {
        for (LinkTargetType methodType : values()) {
            if (methodType.value.equalsIgnoreCase(value)) {
                return methodType;
            }
        }
    }
}
@GetMapping(value = "/link-target/{value}")
public String getLinkTarget(@PathVariable(value = "value") LinkTargetType linkTargetType) {
    return linkTargetType.name();
}

위 상태에서 원래는 api 호출을 /link-target/BLANK, /link-target/SELF 이런 형태로 받아서 처리하게 되는데 /link-target/_blank 이런식으로 enum에 있는 필드의 값을 받아서 처리하고자 한다면 아래의 @InitBinder를 사용할 수 있다.

@InitBinder
private void initBinder(final WebDataBinder webdataBinder) {
    webdataBinder.registerCustomEditor(LinkTargetType.class, new PropertyEditorSupport() {
        @Override
        public void setAsText(String text) {
            setValue(LinkTargetType.fromValue(text));
        }
    });
}

위 처럼 구현해 주게 되면 파라메타를 받아 벨리데이션 처리를 하기전에 @InitBinder를 거쳐 가므로 원하는 값을 받아 원래의 Enum name 값으로 치환 할 수 있다.

Comments