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