変換の一部は基づいている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学習されます