gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:59:40 29 4
gpt4 key购买 nike

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

我想获取类中字符串 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

}
}

最佳答案

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

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

  1. 删除 @RequestBody 注释并将其与 @JsonData 注释组合
  2. 现在,由于 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

关于java - 是否可以从 MethodParameter 对象中获取参数的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32132417/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com