gpt4 book ai didi

java - @PathVariable 的自定义参数解析器

转载 作者:行者123 更新时间:2023-11-30 10:15:28 30 4
gpt4 key购买 nike

场景:我的 Controller 接受 id 的 Long 值,它是一个路径变量。

我需要传递一个 String,它是对 id 的外部引用。所以我需要将字符串引用解析为其 Long 值。

尝试:当注释 @PathVariable 存在时,我的自定义参数解析器不会被调用,因为 PathVariableMethodArgumentResolver 在解析器列表中高于我的自定义解析器,它只支持带有 @PathVariable 注释的所有参数

如果我删除 @PathVariable 并添加我自己的注释,它会正常工作。但是随后 Swagger 将 id 作为请求正文参数获取并产生此错误:

TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.

我的自定义解析器:

@Override
public boolean supportsParameter( MethodParameter methodParameter )
{
return methodParameter.hasParameterAnnotation( ExternalRefParam.class );
}

@Override public Object resolveArgument( MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory ) throws Exception
{
Map nameValueMap = (Map) nativeWebRequest.getAttribute( HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, 0 );
switch( methodParameter.getParameterName() )
{
case CART_ID:
return resolveCartId( nameValueMap );
case PRODUCT_KEY:
return resolveProductKey( nameValueMap );
}
return -1L;
}

Controller 签名:

public ResponseEntity<Cart> readCart( 
@ApiParam(value = "Cart ID", required = true) @ExternalRefParam Long cartId, HttpServletRequest request )

最佳答案

我有一个类似的问题,我想添加一个自定义参数解析器,将路径变量字符串值转换为大写。我通过创建一个 GenericConverter 解决了这个问题,它转换了一个字符串 => 为带有特定注释的路径变量注释的字符串。

路径变量注解类型只是一个标记注解,像这样:

    @Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Uppercase {
String value() default "";
}

它被用在像这样的 rest Controller 映射上

    @PostMapping(value = "/clients/{clientId}/postalAddress")
@ResponseStatus(HttpStatus.CREATED)
public IdResponse create(
@PathVariable("clientId") @Uppercase final String clientId,
@RequestBody @NotNull @Valid final AddressRequest request) {...}

然后触发通用转换器以在任何字符串参数上运行,并且转换方法检查参数是否标记有 Uppercase 注释以了解它是否应该大写。这也意味着 Swagger API 仍将路径变量报告为来自路径并正确提取路径变量值,然后在使用 Uppercase 注释时运行转换器。

    public class CarPolicyIdAttributeConverter implements GenericConverter {

@Override
public Set<ConvertiblePair> getConvertibleTypes() {
final ConvertiblePair[] pairs = new ConvertiblePair[] {
new ConvertiblePair(String.class, String.class)
};
return ImmutableSet.copyOf(pairs);
}

@Override
public Object convert(final Object source, final TypeDescriptor sourceType, final TypeDescriptor targetType) {
if (targetType.getAnnotation(Uppercase.class) != null) {
return ((String)source).toUppercase();
}
return source;
}
}

关于java - @PathVariable 的自定义参数解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447486/

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