You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:18:14