JAX-RS,如何替换queryParam值

时间:2017-05-18 17:39:30

标签: java jax-rs jersey-2.0

所以我必须创建一个添加/格式化日期字符串的过滤器。

我的实现是创建ContainerRequestFilter并在那里执行格式化;然后通过@NameBinding添加此自定义过滤器。

我的问题似乎是@NameBinding@PreMatching一起使用时会被忽略,因此我无法使用反射来从我的过滤器/注释中提取属性。

因此,在过滤器中执行格式化后,想法是使用:

uriBuilder.replaceQueryParam(startDateQueryParamName, formattedString);

但即使我添加硬编码值,该值仍然是原始值。

说我发出请求:.../api/x?startDate=1234-01-01T00:00:00

我在过滤器中硬编码:

`uriBuilder.replaceQueryParam(startDateQueryParamName, "2020-05-05T00:00:00");`

我仍然在资源方法中获得1234-01-01T00:00:00

@GET
@Path("/t1")
@Produces(MediaType.TEXT_PLAIN)
@StartEndDateFilter(required = true)
public String testLocalDateTime(@QueryParam("startDate") LocalDateTime startDate, @QueryParam("endDate") LocalDateTime endDate, @Context UriInfo urinfo) {

    MultivaluedMap<String, String> m = urinfo.getQueryParameters();        
    String d = startDate == null ? "nothin " : startDate.toString();
    String e = endDate == null ? "nothin " : endDate.toString();

    return String.format("start: %s \nend:  %s", d, e);
}

所以,我认为使用@PreMatching会有所帮助,但正如我所提到的,这显示了一个警告:

  

警告:@PreMatching提供程序,类com.api.DateRangeFilter,也是   使用名称绑定注释进行注释。名称绑定将是   忽略。

最重要的是,当我调用requestContext.setRequestUri(uriBuilder.build());时,我在调用端点时收到以下错误:

  

警告:StandardWrapperValve [com.api.Ap]:Servlet.service()for   servlet com.api.Ap抛出异常java.lang.IllegalStateException:   只能在预匹配请求过滤器中调用方法。在   org.glassfish.jersey.server.ContainerRequest.setRequestUri(ContainerRequest.java:411)     在com.api.DateRangeFilter.filter(DateRangeFilter.java:153)

第153行是:

requestContext.setRequestUri(uriBuilder.build());

0 个答案:

没有答案