【发布时间】:2018-05-21 11:04:23
【问题描述】:
场景:我的控制器接受 Long 值作为路径变量的 id。
我需要传递一个String,它是对 id 的外部引用。所以我需要将字符串引用解析为它的Long 值。
尝试:当注释 @PathVariable 存在时,我的自定义参数解析器不会被调用,因为 PathVariableMethodArgumentResolver 高于解析器列表中的自定义解析器,它只支持带有 @PathVariable 注释的所有参数
如果我删除 @PathVariable 并添加我自己的注释,它会正常工作。但随后 Swagger 将 id 作为 Request body 参数获取并产生此错误:
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;
}
控制器签名:
public ResponseEntity<Cart> readCart(
@ApiParam(value = "Cart ID", required = true) @ExternalRefParam Long cartId, HttpServletRequest request )
【问题讨论】:
标签: java spring spring-mvc swagger swagger-2.0