복붙노트

[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. ==============================

    1.당신의 문제는 @ModelAttribute라고 생각합니다. Spring이 MyBean 객체에 매개 변수를 매핑하도록 요청하고 있습니다.이 객체 내부의 property는 valueName입니다.

    당신의 문제는 @ModelAttribute라고 생각합니다. Spring이 MyBean 객체에 매개 변수를 매핑하도록 요청하고 있습니다.이 객체 내부의 property는 valueName입니다.

    params를 객체에 반영하려면 Spring이 올바른 경우에 있어야합니다.

    다음 두 가지 옵션이 있습니다.

  2. ==============================

    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. ==============================

    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);
            }
        }
    }
    
  4. from https://stackoverflow.com/questions/32364126/spring-mvc-case-insensitive-get-parameters-mapping by cc-by-sa and MIT license