2015-08-21 1 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, но можно ли получить фактическое значение параметра, которое передается вместе с веб-запросом?

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'. Весна будет использовать только один 'HandlerMethodArgumentResolver' (тот, который для' @ RequestBody') для создания аргумента. –

+1

[Read this.] (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, чтобы извлечь строку из тела веб-запроса. Это я так, как показано ниже:

    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

Смежные вопросы