@DefaultValue в JAX-RS для дат: сейчас () и MAX
У меня есть параметр запроса следующим образом:
@GET
public Response myFunction(@QueryParam("start") final LocalDate start, @QueryParam("end") final LocalDate end) { ... }
Для этого я создал ParamConverter<LocalDate>
который преобразует строку в дату, и наоборот.
Теперь я хочу использовать @DefaultValue
аннотация для объявления значения по умолчанию. У меня есть два специальных значения по умолчанию:
- сегодня (для
start
) - максимальное значение / бесконечность (для
end
)
Можно ли использовать @DefaultValue
аннотация для этого? Как?
1 ответ
Да, @DefaultValue
Значение может быть использовано в этой ситуации:
@GET
public Response foo(@QueryParam("start") @DefaultValue("today") LocalDate start,
@QueryParam("end") @DefaultValue("max") LocalDate end) {
...
}
Ваш ParamConverterProvider
а также ParamConverter
реализации могут быть как:
@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();
}