웹찢남

Spring - Argument Resolver 본문

BACK_END/Spring 공부

Spring - Argument Resolver

harry595 2021. 3. 8. 20:03

Argument Resolver란?

- 컨트롤러의 메소드 인자로 사용자가 임의의 값을 전달하는 방법을 제공하고자 할 때 사용

- ex) 세션에 저장되어 있는 값 중 특정 이름의 값을 메소드 인자로 전달

 

작성 방법

- org.springframework.web.method.support.HandlerMethodArgumentResolver를 구현한 클래스 작성

- supportsParameter 메소드를 오버라이딩 한 후, 원하는 타임의 인자가 있는지 검사한 후 있을 때 True 리턴

- resolveArgument 메소드를 오버라이딩 한 후, 메소드의 인자로 전달할 값을 리턴

 

JavaConfig에 설정하는 방법

- WebMvcConfigurerAdapter를 상속받은 Java Config 파일에서 addArgumentResolvers 메소드를 오버라이딩 한 후 원    하는 Arguemtn Resolver 클래스 객체를 등록

 

XML 파일에 설정하는 방법

<mvc:annotation-driven>
  <mvc:argument-resolvers>
    <bean class="아규먼트리졸버클래스"</bean>
  </mvc:argument-resolvers>
</mvc:annotation-driven>

실습

HeaderInfo.java

package kr.or.connect.guestbook.argumentresolver;

import java.util.HashMap;
import java.util.Map;

public class HeaderInfo {
	private Map<String, String> map;
	
	public HeaderInfo() {
		map = new HashMap<>();
	}

	public void put(String name, String value) {
		map.put(name,  value);
	}
	
	public String get(String name) {
		return map.get(name);
	}

}

 

HeaderMapArgumentResolver.java

package kr.or.connect.guestbook.argumentresolver;

import java.util.Iterator;

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

public class HeaderMapArgumentResolver implements HandlerMethodArgumentResolver {

	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		return parameter.getParameterType() == HeaderInfo.class;
	}

	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

		HeaderInfo headerInfo = new HeaderInfo();
		
		Iterator<String> headerNames = webRequest.getHeaderNames();
		while(headerNames.hasNext()) {
			String headerName = headerNames.next();
			String headerValue = webRequest.getHeader(headerName);
//			System.out.println(headerName + " , " + headerValue);
			headerInfo.put(headerName, headerValue);
		}
		
		return headerInfo;

	}

}

 

WebMvcContextConfiguration.java(추가)

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    System.out.println("아규먼트 리졸버 등록..");
    argumentResolvers.add(new HeaderMapArgumentResolver());
}

Controller 추가

@GetMapping(path="/list")
public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
				ModelMap model, @CookieValue(value="count", defaultValue="1", required=true) String value,
				HttpServletResponse response,
				HeaderInfo headerInfo) {
	System.out.println("-----------------------------------------------------");
	System.out.println(headerInfo.get("user-agent"));
	System.out.println("-----------------------------------------------------");

'BACK_END > Spring 공부' 카테고리의 다른 글

Spring - 파일 업로드 & 다운로드  (0) 2021.03.10
Spring - 로깅  (0) 2021.03.08
Spring - 인터셉터  (0) 2021.03.08
Spring - Security  (0) 2021.03.04
Spring - 상태유지기술  (0) 2021.02.25
Comments