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방식으로 데이터를 던져보자