2015-08-21 89 views
1

我延长HandlerMethodArgumentResolver获得通过自定义注释是否有可能从MethodParameter对象中获取参数的值?

@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) { 
} 

我想在我在我的课串metadataJson获得的价值保持注释的参数保持,特别是在resolveArgument方法。我知道它有一个MethodParameter参数,但是有可能获得与Web请求一起传递的参数的实际值吗?

public class UpdateMetadataInterceptor implements HandlerMethodArgumentResolver { 


@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 { 
    System.out.println("Inside UpdateMetadata"); 
    // TODO something with metadataJson 

} 
} 
+2

“resolveArgument”的用途是**提供**将绑定到参数的值。 Spring会调用你的'UpdateMetadataInterceptor#resolverArgument',获取它的返回值,并用它调用'updateUIMetadata'。 –

+1

在这种情况下,使用'@ RequestBody'和'@ JsonData'注释参数是没有意义的。 Spring将只使用一个'HandlerMethodArgumentResolver'('@ RequestBody')来产生一个参数。 –

+1

[阅读此文](http://stackoverflow.com/questions/18944627/form-submit-in-spring-mvc-3-explanation/18944736#18944736) –

回答

1

HandlerMethodArgumentResolver是,如果春天无法解析的方法的一个或多个参数才会调用。在上面的例子中,一个简单的字符串用@RequestBody注解。因此,Spring将能够从网络请求中解决它。因此HandlerMethodArgumentResolver将永远不会被调用。为了达到我想要的东西,我也跟着下面的策略

  1. 取出@RequestBody注释和俱乐部将其与@JsonData注释现在
  2. ,因为春天不知道如何解决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方法返回对象的相同实例,然后将其转换为字符串

相关问题