我正在扩展HandlerMethodArgumentResolver
以获取由自定义注释注释的参数
@RequestMapping(value = "/cases/{caseId}", params = "meta",
method = PUT, produces = APPLICATION_JSON_VALUE)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public String updateUIMetadata(
@RequestBody
@JsonData(schemaLocation = "schema/metadata_schema.json")
final String metadataJson) {
}
我希望在我的班级{@ 1}}中获取值,特别是在metadataJson
方法中。我知道它有一个resolveArgument
参数,但是是否可以获取与Web请求一起传递的参数的实际值?
MethodParameter
答案 0 :(得分:1)
HandlerMethodArgumentResolver
。在上面的例子中,一个简单的String用@RequestBody
注释。因此,Spring将能够从Web请求中解析它。因此永远不会调用HandlerMethodArgumentResolver
。为了实现我想要的目标,我遵循了以下策略
@RequestBody
注释并使用@JsonData
注释现在,由于Spring不知道如何解决metadataJson
,它会调用HandlerMethodArgumentResolver
。在这里,我们需要实现@RequestBody
的逻辑来从Web请求的主体中提取字符串。我这样做了如下:
public class ValidateJsonSchema implements HandlerMethodArgumentResolver {
@Bean
private RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
return new RequestMappingHandlerAdapter();
}
private RequestResponseBodyMethodProcessor requestResponseBodyMethodProcessor = null;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(JsonData.class);
}
@Override
public String resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
String value = (String) getRequestResponseBodyMethodProcessor()
.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
// do something with value
return value;
}
private RequestResponseBodyMethodProcessor getRequestResponseBodyMethodProcessor() {
if (requestResponseBodyMethodProcessor == null) {
List<HttpMessageConverter<?>> messageConverters = requestMappingHandlerAdapter().getMessageConverters();
requestResponseBodyMethodProcessor = new RequestResponseBodyMethodProcessor(messageConverters);
}
return requestResponseBodyMethodProcessor;
}
}
我使用RequestMappingHandlerAdapter
获取消息转换器并创建了RequestResponseBodyMethodProcessor
的新实例。然后我调用了返回该对象的同一实例的resolveArgument
方法,然后将其转换为String