【问题标题】:@RequestHeader Map<String, String> map default case?@RequestHeader Map<String, String> 映射默认情况?
【发布时间】:2013-01-15 20:07:57
【问题描述】:

在 spring 3.2 中,我们在控制器中使用了它:

@RequestHeader Map&lt;String, String&gt; headers

问题是标题键的映射可以是任何大小写,所以我们必须重新构建标题映射,强制键为小写。

如果 spring 能够始终在地图中的标题上强制小写或大写,以便更容易检查标题,那就太好了。

研究如何改变这种行为很困难,spring mvc 测试设置也是如此。

我们可以覆盖 RequestHeaderMapMethodArgumentResolver 但如何?

【问题讨论】:

    标签: java spring spring-mvc spring-test-mvc


    【解决方案1】:

    是的,您可以覆盖 RequestHeaderMapMethodArgumentResolver。这是一种方法:

    import org.apache.commons.collections.map.CaseInsensitiveMap;
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.core.MethodParameter;
    import org.springframework.web.bind.support.WebDataBinderFactory;
    import org.springframework.web.context.request.NativeWebRequest;
    import org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver;
    import org.springframework.web.method.support.ModelAndViewContainer;
    
    import java.util.Map;
    
    public class FixRequestHeaderMapMethodArgumentResolverConfigurer implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String s) throws BeansException {
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String s) throws BeansException {
            if(bean instanceof RequestHeaderMapMethodArgumentResolver) {
                return new RequestHeaderMapMethodArgumentResolver() {
                    @Override
                    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
                        return new CaseInsensitiveMap((Map)super.resolveArgument(parameter, mavContainer, webRequest, binderFactory));
                    }
                };
            } else
                return bean;
        }
    }
    

    【讨论】:

    • 效果很好,谢谢!虽然我会放弃那个丑陋的类名;]
    • 我认为你应该担心的不仅仅是为每个请求将少量对象放入 HashMap 中的性能影响。无论如何,如果这真的困扰您,您可以通过复制 RequestHeaderMapMethodArgumentResolver 中的代码来创建一个类并根据您的需要进行修改。
    猜你喜欢
    • 2010-10-25
    • 2014-06-25
    • 2011-10-20
    • 2011-10-22
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多