是否可以从MethodParameter对象中获取参数的值?

时间:2015-08-21 04:36:29

标签: java spring spring-mvc

我正在扩展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

1 个答案:

答案 0 :(得分:1)

仅当Spring无法解析方法的一个或多个参数时,才会调用

HandlerMethodArgumentResolver。在上面的例子中,一个简单的String用@RequestBody注释。因此,Spring将能够从Web请求中解析它。因此永远不会调用HandlerMethodArgumentResolver。为了实现我想要的目标,我遵循了以下策略

  1. 删除@RequestBody注释并使用@JsonData注释
  2. 加注
  3. 现在,由于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;
    }
    }
    
  4. 我使用RequestMappingHandlerAdapter获取消息转换器并创建了RequestResponseBodyMethodProcessor的新实例。然后我调用了返回该对象的同一实例的resolveArgument方法,然后将其转换为String