使用匹配后请求筛选器覆盖JAXRS @QueryParameter值

时间:2016-10-09 13:55:40

标签: java filter jax-rs query-parameters

我有一种方法,我需要根据某些计算覆盖查询参数的值:

@GET
@Path("/channel")
@Produces(MediaType.APPLICATION_JSON)
@OptimizedDate
public FancountAndChannel computeFanCount(
        @QueryParam("artist") String artistId,
        @OptimizableDate @QueryParam("date") Integer date, //override this using filters
        @QueryParam("channel") String channel) {

    //do stuffs here
}

我的过滤器如下所示:

@OptimizedDate
public class OptimizedDateFilter implements ContainerRequestFilter {

@Override
public void filter(ContainerRequestContext context) throws IOException {
    if (//certain condition) {
        //im hoping this method would change the "date" value
        Integer optimizedDate = //compute date here
        updateDateParameter(context, "date", optimizedDate );
    }
}   

private void updateDateParameter(ContainerRequestContext context, String fieldName, Integer optimizedDate) {

    //TODO: wont work, only for post-matching filters
    URI oldUri = context.getUriInfo().getRequestUri();
    URI newUri = null;
    try {
        newUri = new URIBuilder(oldUri).setParameter(fieldName, String.valueOf(optimizedDate)).build();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    LOGGER.debug("oldUri={}\nnewUri={}", oldUri, newUri);
    context.setRequestUri(newUri);

    //TODO: wont work: query parameters are immutable
    //context.getUriInfo().getQueryParameters().putSingle(fieldName, String.valueOf(optimizedDate));
    //context.getUriInfo().getQueryParameters().add(fieldName, Arrays.asList(String.valueOf(optimizedDate)));
}

我想覆盖该值,或者设置它(当它为null时)。但是,我尝试过的大多数方法都使用不可变对象。

使用过滤器有没有更好的方法?我可能必须在很多方法中应用相同的逻辑,复制粘贴不是我的风格。

要求摘要:

  1. 值将在运行时计算并确定
  2. 逻辑仅适用于各种JAXRS端点

1 个答案:

答案 0 :(得分:0)

如果你只想在null时设置一个值而不是使用@DefaultValue(“你想要的默认值”)

  public FancountAndChannel computeFanCount(
            @QueryParam("artist") String artistId,
            @OptimizableDate @DefaultValue("default value you want")   @QueryParam("date") Integer date, //override this using filters
            @QueryParam("channel") String channel) {

}