Вам нужен способ конвертировать ваш класс DateRange в String и наоборот.Поскольку вы используете Spring, это можно сделать следующим образом:
1) Добавить логику преобразования
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DateRange {
LocalDate begin;
LocalDate end;
private static final String DELIMITER = "_";
public static DateRange fromFormattedString(String source) {
if (source != null) {
String[] tokens = source.split(DELIMITER);
if (tokens.length == 2) {
return new DateRange(
LocalDate.parse(tokens[0]), // begin
LocalDate.parse(tokens[1]) // end
);
}
}
return null;
}
public String toFormattedString() {
return begin + DELIMITER + end;
}
}
2) Создать конвертер Spring
import org.springframework.core.convert.converter.Converter;
public class DateRangeConverter implements Converter<String, DateRange> {
@Override
public DateRange convert(String source) {
return DateRange.fromFormattedString(source);
}
}
3) Зарегистрировать этот конвертер
Это позволит Spring обрабатывать объекты DateRange, переданные как @RequestParam
-s
@Configuration
public class WebApiConfiguration extends WebMvcConfigurationSupport {
...
@Override
public FormattingConversionService mvcConversionService() {
FormattingConversionService f = super.mvcConversionService();
f.addConverter(new DateRangeConverter());
return f;
}
...
}
И, наконец, используйте как:
.get(String.format("/topics?dateRange=%s", VALID_DATE_RANGE.toFormattedString())
или (с необработанной строкой):
.get(String.format("/topics?dateRange=%s", "2018-1-1_2018-2-2")
НО:
Тем не менее, я бы порекомендовалвам нужно использовать отдельные параметры запроса (начало, конец и т. д.), даже если их 10, потому что это:
1) RESTful-способ
2) защищен от ошибок, поскольку параметры запроса заказапереданы, не строго.С другой стороны, упаковка параметров в один объект заставит вас следить за порядком параметров.Более того, вы должны упаковать все параметры в строку, поэтому дополнительные параметры не допускаются, в противном случае логика распаковки может быть нарушена