4

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

@RequestHeader Map<String, String> headers

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

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

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

我们可以覆盖 RequestHeaderMapMethodArgumentResolver 但如何?

4

1 回答 1

3

是的,您可以覆盖 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;
    }
}
于 2013-01-15T20:46:12.890 回答