首页 > 解决方案 > 以向后兼容的方式为 JerseyClient 将 @QueryParam 添加到 JAX-RS 现有 API

问题描述

我有一个现有的 API。

@Api
@Path("/resourceA/v1")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface ResourceA
{
    @GET
    @Path("{id : .+}")
    getResourceById(@PathParam("id") String id);
}

我们需要@QueryParam向该 API 添加一个新的可选参数 (with ),但我们不想破坏使用此 java 接口调用我们的资源的现有 Jersey 客户端。我们不能简单地将其添加@QueryParam到现有方法中,因为这会破坏向后兼容性,我们仍然希望现有客户端像以前一样工作,只有其中一些需要新参数。

到目前为止,我已经尝试过:

方法一:在接口上使用默认实现。这在客户端上失败,因为泽西客户端使用带有方法拦截器的代理对象,这与default接口的实现不能很好地配合。

@Api
@Path("/resourceA/v1")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface ResourceA
{

    default getResourceById(@PathParam("id") String id) 
    {
        return getResourceById(id, null);
    }

    @GET
    @Path("{id : .+}")
    getResourceById(@PathParam("id") String id, @QueryParam("param") String param);
}

方法二:添加方法的重载getResourceById。然后在我实现方法的服务器端,我管理过载。这不会引发任何错误,但我在服务器端有一个不确定的行为,有时它会调用该方法而param有时它不会调用该方法,如果paramURL 中存在该方法。

@Api
@Path("/resourceA/v1")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface ResourceA
{
    @GET
    @Path("{id : .+}")
    getResourceById(@PathParam("id") String id);

    @GET
    @Path("{id : .+}")
    getResourceById(@PathParam("id") String id, @QueryParam("param") String param);
}

我想知道 JAX-RS 是否有此类修改的最佳实践方法?

谢谢。

标签: jax-rsjersey-client

解决方案


推荐阅读