4

Spring 3.2 では、コントローラーでこれを利用します。

@RequestHeader Map<String, String> headers

問題は、ヘッダー キーのマップが大文字と小文字を区別しないことです。そのため、ヘッダー マップを再構築して、キーを小文字にする必要があります。

ヘッダーのチェックを容易にするために、スプリングが一貫してマップ内のヘッダーに小文字または大文字を強制するとよいでしょう。

その動作を変更する方法を調べるのは難しいです。Spring MVC テストのセットアップについても同じことが言えます。

RequestHeaderMapMethodArgumentResolver をオーバーライドできますが、どうすればよいでしょうか?

4

1 に答える 1

3

はい、RequestHeaderMapMethodArgumentResolver をオーバーライドできます。これを行う1つの方法は次のとおりです。

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 に答える