カスタムArgumentResolver SpringMVCは、カスタムメッセージ型変換を実装します

変換の一部は基づいているRequestResponseBodyMethodProcessorので、パラメータとリターンを追加する必要がある@RequestBody@ResponseBody
、ここで私が書いたMyArgumentResolver放棄する@RequestBody制限を

@PostMapping(value = "/properties2",
            consumes = "text/properties;charset=utf-8")
    public Properties properties2(Properties properties){
        return properties;
    }
public class MyArgumentResolver implements HandlerMethodArgumentResolver {


    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(Properties.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        String contentType = request.getContentType();
        MediaType mediaType = MediaType.parseMediaType(contentType);
        Charset charset = mediaType.getCharset()== null ? Charset.forName("utf-8") : mediaType.getCharset();

        InputStream inputStream = request.getInputStream();
        Reader reader = new InputStreamReader(inputStream,charset);
        Properties properties = new Properties();
        properties.load(reader);

        return properties;
    }
}

我々のパーサは、のパラメータにすべてのパラメータサポートProperties、解像度の種類を特定する変換ロジックは、基本的変換のうちの1つと同じであり、実際に内部SpringMVCも利便性がここに直接実装分析を委託変換するためにそこに委任することができます
パーサをバック追加するときNOTE以下のように後のレジスタが、カスタムリゾルバは、構築されます。
ここに画像を挿入説明
したがって、次のレジスタを使用して簡単な方法は現実的ではありません

@Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(0,new MyArgumentResolver());
    }

登録はこちらすべてのトップではなく、すべてのカスタムパーサー最初の場所の、まだ組み込みパーサの背面にある私たちのカスタムパーサーパーサーを作成しません。
マップタイプに属するプロパティは、マップタイプパーサパーサが構築されているので、予想通り、我々は独自のパーサーに呼び出すことはできません。
ここで使用される別の方法は、解析し、

@Autowired
    private RequestMappingHandlerAdapter adapter;

    @PostConstruct
    public void init(){
        List<HandlerMethodArgumentResolver> old = adapter.getArgumentResolvers();
        List<HandlerMethodArgumentResolver> newList = new ArrayList<>(old.size()+1);
        newList.add(new MyArgumentResolver());
        newList.addAll(old);
        adapter.setArgumentResolvers(newList);
    }

返されたリストによる在籍リストパーサカバレッジの初期化メソッドを使用すると、追加の配列の新しいコピーを達成するので、変更することはできません

ここに画像を挿入説明

SpringMVCコンバータについてPS最近のいくつかの記事は、兄のおかげで多くのことを当然の馬英九の参照SpringBoot学習されます

公開された98元の記事 ウォンの賞賛9 ビュー10000 +

おすすめ

転載: blog.csdn.net/Mutou_ren/article/details/104083988