OpenAPI生成Resteasy服务Filter参数始终为Null问题排查
问题:切换到jaxrs-resteasy后Filter参数始终为Null
原本使用jaxrs-spec生成服务,现切换为jaxrs-resteasy(WildFly原生使用Resteasy,且原工具返回的响应状态与YAML定义不符),但无论传入什么参数,Filter参数始终为Null。
API规范定义(YAML片段)
get: operationId: getMessageByFilter description: Get a specific message by filter option (messageStatus, creationDateTime, recipientAttention.subOrganization.extension, senderAttention.subOrganization.extension). This operation always excludes digitalDocument tags: - Message life cycle parameters: - in: query name: filter description: "The filter query parameter family is reserved to be used as the basis for any filtering of strategy. ?Filter[attribute]=value" example: '?filter[recipientAttention.subOrganization.extension]=sdk:inkorg001:0203:inera.se' schema: type: object properties: 'recipientAttention.subOrganization.extension': type: string 'senderAttention.subOrganization.extension': type: string messageStatus: $ref: "#/components/schemas/messageStatusDef" creationDateTimeStart: type: string format: date-time creationDateTimeStop: type: string format: date-time style: deepObject allowReserved: true
生成的服务代码
@Produces({ "application/json" }) @io.swagger.annotations.ApiOperation(value = "", notes = "Get a specific message by filter option (messageStatus, creationDateTime, recipientAttention.subOrganization.extension, senderAttention.subOrganization.extension). This operation always excludes digitalDocument", response = OutputArrayData.class, authorizations = { @io.swagger.annotations.Authorization(value = "message_auth", scopes = { @io.swagger.annotations.AuthorizationScope(scope = "urn:sdk.api:getMessageByFilter", description = "get a message by filter") }) }, tags={ "Message life cycle", }) @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 200, message = "OK", response = OutputArrayData.class), @io.swagger.annotations.ApiResponse(code = 400, message = "BadRequest", response = Events.class), @io.swagger.annotations.ApiResponse(code = 401, message = "Unauthorized", response = Void.class), @io.swagger.annotations.ApiResponse(code = 404, message = "Not found.", response = Void.class) }) public Response getMessageByFilter( @QueryParam("filter") GetMessageByFilterFilterParameter filter,@Context SecurityContext securityContext) throws NotFoundException { return service.getMessageByFilter(filter,securityContext); }
自定义ParamConvertProvider未被调用
为解决参数绑定问题,添加了ParamConvertProvider实现,但切换到Resteasy后该Provider从未被触发:
@Provider public class SdkApiParameterConverter implements ParamConverterProvider { private GetByFilterParamConverter converter; @SuppressWarnings("unchecked") @Override public <T> ParamConverter<T> getConverter(Class<T> aClass, Type type, Annotation[] annotations) { if (aClass.isAssignableFrom(GetMessageByFilterFilterParameter.class)) { if (converter == null) { converter = new GetByFilterParamConverter(); } return (ParamConverter<T>) converter; } return null; } }
疑问
- YAML文件是否存在问题?
- 是否需要其他额外实现才能解决该参数绑定问题?
目前临时方案是通过HttpServletRequest对象手动解析查询字符串。
内容的提问来源于stack exchange,提问作者McNisse
相关产品推荐
相关产品推荐

