我有一种方法,我需要根据某些计算覆盖查询参数的值:
@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时)。但是,我尝试过的大多数方法都使用不可变对象。
使用过滤器有没有更好的方法?我可能必须在很多方法中应用相同的逻辑,复制粘贴不是我的风格。
要求摘要:
答案 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) {
}