java - Spring mvc。不区分大小写的获取参数映射

标签 java spring spring-mvc mapping servlet-filters

根据 this answer 我尝试编写我的代码:

pojo:

class MyBean{

    public String getValueName() {
        return valueName;
    }

    public void setValueName(String valueName) {
        this.valueName = valueName;
    }

    String valueName;
}

内部 Controller :

    @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 - 无效

最佳答案

我相信你的问题是 @ModelAttribute。您要求 Spring 将参数映射到 MyBean 对象,并且该对象内的属性是 valueName

为了让 Spring 将参数反射(reflect)到对象,它需要使用正确的大小写。

你有两个选择:

  • 在您的 MyBean 对象中将属性名称更改为 valuename,并将所有属性名称更改为小写,它应该在您的解决方案的帮助下工作。
  • 删除 @ModelAttribute 并为每个属性添加 @RequestParam。如果你有很多 Prop ,这可能会很痛苦。

关于java - Spring mvc。不区分大小写的获取参数映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32364126/

相关文章:

java - 如何解决 NaN 错误

java - Spring Boot 管理和日志记录

java - AbstractUserTypeHibernateIntegrator 用户类型的 Hibernate 空指针

spring-mvc - 如何使用 Feign 客户端设置请求头?

java - 如何在 Spring 和 JPA/Hibernate 中实现工作单元?

javascript - 如何保持 Spring 表单中选定的值 :options?

java - 查询通知

java - Android中可以根据不同的状态条件显示不同的布局组件吗?

java - 将变量传递给一个子类

mysql - 无法 Autowiring 字段 : com. srk.dao.UserDao com.srk.service.UserServiceImpl.userDao; org.springframework.orm.hibernate4.LocalSessionFactoryBuilder