@PathVariable的自定义参数解析器

时间:2018-05-21 11:04:23

标签: java spring spring-mvc swagger swagger-2.0

场景:我的控制器接受id为Long的值,该值是路径变量。

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

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

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

@PathVariable

我的自定义解析器:

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;
}

1 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我想添加一个自定义参数解析器,该解析器会将路径变量字符串值转换为大写。我通过创建一个@include media-breakpoint-up(sm) { ... }来解决此问题,该{@ 1}转换了一个字符串=>字符串,用于带有特定注释的路径变量。

路径变量注释类型只是这样的标记注释:

GenericConverter

用于这样的rest控制器映射

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

然后触发通用转换器在任何String参数上运行,并且convert方法检查该参数是否用 @PostMapping(value = "/clients/{clientId}/postalAddress") @ResponseStatus(HttpStatus.CREATED) public IdResponse create( @PathVariable("clientId") @Uppercase final String clientId, @RequestBody @NotNull @Valid final AddressRequest request) {...} 注释标记,以了解是否应将其大写。这也意味着Swagger API仍会将路径变量报告为来自路径,并正确提取路径变量值,然后在用Uppercase注释的情况下运行转换器。

Uppercase