스프링 @MVC를 사용하면
컨트롤러에 URL과 일치하는 함수를 구현해야 하는데,
URL에 파라미터가 존재할 때, 함수 파라미터를 지정하면 기본 타입(ENUM, INT, STRING, ...)인 경우 자동으로 바인딩 된다.
하지만 ENUM은 ENUM에 정의한 상수 이름과 일치해야 자동으로 바인딩 되는데, 상수 이름이 아닌 값으로도 바인딩 되도록 하고 싶었다.
자동 바인딩 되는 예)
enum{BASIC(0), GOLD(1)}
url?enum=BASIC
자동으로 되지 않는 예)
enum{BASIC(0), GOLD(1)}
url?enum=1
ENUM에 정의된 숫자값으로도 자동 바인딩될 수 있도록 사용자 정의 컨버터를 구현해야 한다.
구현 방법
Converter interface를 상속하여 사용자 정의 컨버터를 구현
사용자 정의 컨버터를 xml에 추가
root-context.xml
servlet-context.xml
Level.java
public enum Level {
BASIC(0),
GOLD(1);
private int m_value;
private Level(int value)
{
m_value = value;
}
public int getValue()
{
return m_value;
}
static public Level valueOf(int value)
{
switch(value)
{
case 0:
return BASIC;
case 1:
return GOLD;
default:
throw new AssertionError("Unknown value : " + value);
}
}
}
MyStringToLevel.java
public class MyStringToLevel implements Converter {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@Override
public Level convert(String arg0) {
// TODO Auto-generated method stub
logger.info("convert {}.", arg0);
return Level.valueOf(Integer.valueOf(arg0));
}
}
HomeController.java
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String home(@RequestParam Level level) {
logger.info("Welcome home! The client locale is {}.", level);
return "home";
}
}
테스트
http://localhost:8080/mytest/test?level=1
결과
INFO : com.yakolla.mytest.HomeController - Welcome home! The client locale is GOLD.