java - JAX-RS 中的 @DefaultValue 日期为 : now() and MAX

标签 java jersey jax-rs jersey-2.0 java-time

我有一个查询参数如下:

@GET
public Response myFunction(@QueryParam("start") final LocalDate start, @QueryParam("end") final LocalDate end) { ... }

为此,我创建了一个 ParamConverter<LocalDate>它将字符串转换为日期,反之亦然。

现在我想使用 @DefaultValue用于声明默认值的注解。我有两个特殊的默认值:

  • 今天(start)
  • 最大值/无穷大(对于 end )

是否可以使用 @DefaultValue这个注释?怎么办?

最佳答案

是的,@DefaultValue在这种情况下可以使用值:

@GET
public Response foo(@QueryParam("start") @DefaultValue("today") LocalDate start,
                    @QueryParam("end") @DefaultValue("max") LocalDate end) { 

    ...
}

你的 ParamConverterProviderParamConverter实现可以是这样的:

@Provider
public class LocalDateParamConverterProvider implements ParamConverterProvider {

    @Override
    public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, 
                                              Annotation[] annotations) {

        if (rawType.getName().equals(LocalDate.class.getName())) {

            return new ParamConverter<T>() {

                @Override
                public T fromString(String value) {
                    return parseString(value, rawType);
                }

                @Override
                public String toString(T value) {
                    return ((LocalDateTime) value)
                            .format(DateTimeFormatter.ISO_LOCAL_DATE);
                }
            };
        }

        return null;
    }

    private <T> T parseString(String value, Class<T> rawType) {

        if (value == null) {
            return null;
        }

        if ("today".equalsIgnoreCase(value)) {
            return rawType.cast(LocalDate.now());
        }

        if ("max".equalsIgnoreCase(value)) {
            return rawType.cast(LocalDate.of(9999, 12, 31));
        }

        try {
            return rawType.cast(LocalDate.parse(value, 
                    DateTimeFormatter.ISO_LOCAL_DATE));
        } catch (Exception e) {
            throw new BadRequestException(e);
        }
    }
}

如果出于某种原因,您需要参数名称,您可以从Annotation 数组中获取它:

Optional<Annotation> optional = Arrays.stream(annotations)
        .filter(annotation -> annotation.annotationType().equals(QueryParam.class))
        .findFirst();

if (optional.isPresent()) {
    QueryParam queryParam = (QueryParam) optional.get();
    String parameterName = queryParam.value();
}

关于java - JAX-RS 中的 @DefaultValue 日期为 : now() and MAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48114283/

相关文章:

java - 如何将 ToXmlGenerator.Feature 添加到 Jackson2ObjectMapperBuilderCustomizer?

java - Jedis key 过期

java - 使用经过身份验证的 session 的 Jersey 客户端

java - 服务器启动时出现 org.glassfish.jersey.servlet.ServletContainer ClassNotFoundException

java - @PathParam 没有给我路径变量

java - Android非法状态异常

java - 如何在java中读取HTML属性值?

java.lang.NoSuchMethodError : javax. ws.rs.core.Application.getProperties()Ljava/util/Map

java - 使用 HQL Select 的 Hibernate 和 JAX-RS 响应

tomcat - JAX-RS 响应为 404 时的 HTML 响应