오락기/spring

HandlerMethodArgumentResolver

문방구앞오락기 2017. 7. 11. 18:17

controller 메서드에 파라미터로 객체를 주입할수 잇는 기능

controller에 공통적으로 파라미터에 추가 되어야 하는 경우에 사용하면 되며, 


#

예를들어 로그인의 경우 로그인한 사용자정보나 권한정보 등을 controller에서 바로 사용가능하게 해주는 개념

#



 <mvc:annotation-driven/>를 선안하면 문제가 생긴다. 

파라미터가 꼭 Map형식이면 동작하지않는다. 

-> 구현한다 해도 ArgmentResolver를 거치게 되어있다.



우선 맵처리용 클래스



package com.plays.js.common.common;


import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;


public class CommonMap {


/*

*  HandlerMethodArgumentResolver 용 공용 map.VO

*/

Map map  = new HashMap();


public Object getMap(Object key) {

return this.map.get(key);

}


public void putMap(Object key, Object value) {

this.map.put(key, value);

}

public Object remove(Object key){

return this.map.remove(key);

}

public boolean containsKey(Object key){

return this.map.containsKey(key);

}

public boolean containsValue(Object value){

return this.map.containsValue(value);

}

public Set<Entry> entrySet(){

 return this.map.entrySet();

}

public Set<Object> keySet(){

return this.map.keySet();

}

public boolean isEmpty(){

        return map.isEmpty();

    }

     

    public void putAll(Map<? extends String, ?extends Object> m){

        map.putAll(m);

    }

     

    public Map<String,Object> getMap(){

        return map;

    }



}



HandlerMethodArgumentResolver를 구현한 클래스도 생성



package com.plays.js.common.resolver;


import java.util.Enumeration;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import com.plays.js.common.common.CommonMap;

public class MapArgumentResolver implements HandlerMethodArgumentResolver{

@Override
public Object resolveArgument(MethodParameter parm, ModelAndViewContainer mvc, NativeWebRequest webReq,
WebDataBinderFactory webDataBind) throws Exception {
CommonMap commonMap = new CommonMap();
HttpServletRequest req = (HttpServletRequest) webReq.getNativeRequest();
Enumeration<?> enumeration = req.getParameterNames();
String key = null;
String[] val = null;
while(enumeration.hasMoreElements()){
key = (String)enumeration.nextElement();
val = req.getParameterValues(key);
if(val != null){
  commonMap.putMap(key, (val.length > 1) ? val:val[0] );

}
}
return commonMap;
}

@Override
public boolean supportsParameter(MethodParameter param) {
return CommonMap.class.isAssignableFrom(param.getParameterType());
}

}

빈에 등록

<annotation-driven>
<argument-resolvers>
<beans:bean class="com.plays.js.common.resolver.MapArgumentResolver"/>
</argument-resolvers>
</annotation-driven>



컨트롤러에 등록시키고 테스트



@RequestMapping(value="resolver.rest")
public ModelAndView ModelAndViewtestMapArgmentResolver(CommonMap commonMap ) throws Exception{
ModelAndView mv = new ModelAndView("");
if(commonMap.isEmpty()){
Iterator<Entry<String, Object>> iterator =commonMap.getMap().entrySet().iterator();
Entry<String,Object> entry = null;
while(iterator.hasNext()){
           entry = iterator.next();
           log.debug("key : "+entry.getKey()+", value : "+entry.getValue());
       }
}
return mv;
}


get방식으로 데이터를 던져보자