所以我必须创建一个添加/格式化日期字符串的过滤器。
我的实现是创建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());