@InitBinder를 이용한 사용자 로그인 정보 @ModelAttribute 객체에 저장하기

@InitBinder

public void initBinder(WebDataBinder binder){

binder.registerCustomEditor(String.class, "userId", new PropertyEditorSupport() {

@Override

public void setAsText(String text) throws IllegalArgumentException {    

super.setValue(text);

}

});

}

userId=1111로의 파라미터 요청 시 setAsText 메소드의 text 매개변수는 1111 값이 맵핑되어져 있다.


binder.registerCustomEditor를 위와 같이 등록하게 되면 파라미터 Class가 String 타입이고, userId 파라미터 명인 경우 propertyEditor 핸들러가 파라미터에 대한 내부 처리를 진행한다.

requireType : 파라미터 Class

field : 파라미터 명

propertyEditor : 파라미터 처리 핸들러


간혹 다음과 같이 Server 객체 내부에 존재하는 userId 필드에 로그인 되어 있는 사용자의 계정 정보를 @InitBinder를 이용하여 셋팅해 주고 싶을 때가 있다. 

public String list(@ModelAttribute Server server, Model model) {

...

}



이를 위해서 registerCustomEditor를 이용하여 해결할 수도 있으나 파라미터를 넘겨줘야 registerCustomEditor가 작동하기 때문에 다음과 같이 처리를 했다.

@InitBinder

public void initBinder(WebDataBinder binder) {

Object obj = binder.getTarget();

if (obj instanceof Server) {

Server server = (Server) obj;

server.setUserId(AuthUtil.userId());

}

}


AuthUtil.userId() 메소드는 다음과 같이 되어 있음

public static String userId() {

Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    String userId = auth.getName();

    return userId;

}