[SPRING] 봄 mvc. 대소 문자를 구별하지 않는 매개 변수 매핑 가져 오기
SPRING봄 mvc. 대소 문자를 구별하지 않는 매개 변수 매핑 가져 오기
이 대답에 따르면 나는 내 코드를 작성하려고한다 :
pojo :
class MyBean{
public String getValueName() {
return valueName;
}
public void setValueName(String valueName) {
this.valueName = valueName;
}
String valueName;
}
내부 컨트롤러 :
@ModelAttribute
public MyBean createMyBean() {
return new MyBean();
}
@RequestMapping(value = "/getMyBean", method = RequestMethod.GET)
public String getMyBean(@ModelAttribute MyBean myBean) {
System.out.println(myBean.getValueName());
return "pathToJsp";
}
web.xml 구성 :
<filter>
<filter-name>caseInsensitiveFilter</filter-name>
<filter-class>com.terminal.interceptor.CaseInsensitiveRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>caseInsensitiveFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
필터:
@Component
public class CaseInsensitiveRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(new CaseInsensitiveHttpServletRequestWrapper(request), response);
}
private static class CaseInsensitiveHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final LinkedCaseInsensitiveMap params = new LinkedCaseInsensitiveMap();
/**
* Constructs a request object wrapping the given request.
*
* @param request
* @throws IllegalArgumentException if the request is null
*/
private CaseInsensitiveHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
params.putAll(request.getParameterMap());
}
@Override
public String getParameter(String name) {
String[] values = getParameterValues(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
}
@Override
public Map getParameterMap() {
return Collections.unmodifiableMap(this.params);
}
@Override
public Enumeration getParameterNames() {
return Collections.enumeration(this.params.keySet());
}
@Override
public String[] getParameterValues(String name) {
return (String[]) params.get(name);
}
}
}
디버그에서 나는 그 필터 메서드 호출을 참조하십시오 그러나 나는 인내심 매개 변수 매핑을 얻을 사건을 얻을 수 없습니다.
예 : localhost : 8081 / getMyBean? valueName = trololo는 작동하지만 localhost : 8081 / getMyBean? valuename = trololo - not
해결법
-
==============================
1.당신의 문제는 @ModelAttribute라고 생각합니다. Spring이 MyBean 객체에 매개 변수를 매핑하도록 요청하고 있습니다.이 객체 내부의 property는 valueName입니다.
당신의 문제는 @ModelAttribute라고 생각합니다. Spring이 MyBean 객체에 매개 변수를 매핑하도록 요청하고 있습니다.이 객체 내부의 property는 valueName입니다.
params를 객체에 반영하려면 Spring이 올바른 경우에 있어야합니다.
다음 두 가지 옵션이 있습니다.
-
==============================
2.여기 당신이 할 수있는 일이 있습니다 ...
여기 당신이 할 수있는 일이 있습니다 ...
모든 소문자 변수를 사용하여 도메인 (POJO)을 만듭니다.
public class MyBean{ private String valuename; public String getValuename() { return valuename; } public void setValuename(String valuename) { this.valuename = valuename; } }
그런 다음 HttpServletRequestWrapper를 확장 할 클래스를 만듭니다.
public class CustomWrappedRequest extends HttpServletRequestWrapper { private final Map<String, String[]> modifiableParameters; private Map<String, String[]> allParameters = null; public CustomWrappedRequest(final HttpServletRequest request, final Map<String, String[]> additionalParams) { super(request); modifiableParameters = new TreeMap<String, String[]>(); modifiableParameters.putAll(additionalParams); } @Override public String getParameter(final String name) { String[] strings = getParameterMap().get(name); if (strings != null) { return strings[0]; } return super.getParameter(name); } @Override public Map<String, String[]> getParameterMap() { if (allParameters == null) { allParameters = new TreeMap<String, String[]>(); allParameters.putAll(super.getParameterMap()); allParameters.putAll(modifiableParameters); } return Collections.unmodifiableMap(allParameters); } @Override public Enumeration<String> getParameterNames() { return Collections.enumeration(getParameterMap().keySet()); } @Override public String[] getParameterValues(final String name) { return getParameterMap().get(name); } }
doFilter ()가 다음과 같이 보일 것입니다.
public void doFilter(ServletRequest request, ServletResponse reponse, FilterChain chain) throws IOException, ServletException { Map<String, String[]> params = request.getParameterMap(); Map<String, String[]> extraParams = new TreeMap<String, String[]>(); Iterator<String> i = params.keySet().iterator(); while ( i.hasNext() ) { String key = (String) i.next(); String value = ((String[]) params.get( key ))[ 0 ]; extraParams.put(key.toLowerCase(), new String[] {value}); } HttpServletRequest wrappedRequest = new CustomWrappedRequest((HttpServletRequest)request, extraParams); chain.doFilter(wrappedRequest, reponse); }
여기서 필터는 매개 변수를 소문자로 변환하고 사용자 정의 요청에 첨부합니다. 그런 다음 컨트롤러 코드에서 @ModelAttribute를 사용하여 원하는 객체를 가져올 수 있습니다.
희망이 도움이 :)
-
==============================
3.사실, 당신은 당신의 bean 변수 이름에 따라 CaseInsensitiveRequestFilter 클래스의 것들을 변경해야한다. 귀하의 경우에는 변수가 valueName이므로 모든 요청에 대해 변수 setter 메소드의 낙타 케이스 주입 당 변환 한 다음 요청에 따라 일치시킵니다. 맞춤 설정 요구 사항을 시도해보십시오.
사실, 당신은 당신의 bean 변수 이름에 따라 CaseInsensitiveRequestFilter 클래스의 것들을 변경해야한다. 귀하의 경우에는 변수가 valueName이므로 모든 요청에 대해 변수 setter 메소드의 낙타 케이스 주입 당 변환 한 다음 요청에 따라 일치시킵니다. 맞춤 설정 요구 사항을 시도해보십시오.
package biz.deinum.web.filter; import java.io.IOException; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.web.filter.OncePerRequestFilter; public class CaseInsensitiveRequestFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { filterChain.doFilter(new CaseInsensitiveHttpServletRequestWrapper(request), response); } private static class CaseInsensitiveHttpServletRequestWrapper extends HttpServletRequestWrapper { private final LinkedCaseInsensitiveMap<String[]> params = new LinkedCaseInsensitiveMap<>(); private CaseInsensitiveHttpServletRequestWrapper(HttpServletRequest request) { super(request); Map<String, String[]> map = request.getParameterMap(); Set set = map.entrySet(); Iterator it = set.iterator(); Map<String, String[]> tempMap = new HashMap<String, String[]>(); while (it.hasNext()) { Map.Entry<String, String[]> entry = (Entry<String, String[]>) it.next(); String key = entry.getKey(); // Keep your parameter bean name here in your case it is "valueName" String beanParamaterName = "valueName"; if(key.equalsIgnoreCase(beanParamaterName)){ tempMap.put(key.toLowerCase(), entry.getValue()); } } params.putAll(tempMap); } @Override public String getParameter(String name) { String[] values = getParameterValues(name); System.out.println(values.toString()+"-"); if (values == null || values.length == 0) { return null; } return values[0]; } @Override public Map<String, String[]> getParameterMap() { return Collections.unmodifiableMap(this.params); } @Override public Enumeration<String> getParameterNames() { return Collections.enumeration(this.params.keySet()); } @Override public String[] getParameterValues(String name) { System.out.println(name); return (String[])params.get(name); } } }
from https://stackoverflow.com/questions/32364126/spring-mvc-case-insensitive-get-parameters-mapping by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] SpEL에서 어떻게 값을 벗어나나요? (0) | 2019.05.06 |
---|---|
[SPRING] 봄 mvc : xml에서 json으로 기본 응답 형식 변경 (0) | 2019.05.06 |
[SPRING] Log4J - SiftingAppender와 유사한 기능 (0) | 2019.05.06 |
[SPRING] @Constructor annotation에 의해 annoted 된 Spring 구성 클래스에 기본 생성자가 있어야하는 이유는 무엇입니까? (0) | 2019.05.06 |
[SPRING] 최대 절전 모드 : 클래스에 적절한 생성자를 찾을 수 없음 - HQL (0) | 2019.05.06 |