Пользовательский объект как @RequestParam - PullRequest
0 голосов
/ 26 марта 2019

У меня есть конечная точка с нумерацией страниц, которая выглядит следующим образом /api/clients?range=0-25.

Я бы хотел, чтобы метод getClients () в моем ClientController непосредственно получал экземпляр пользовательского объекта Range, а не проверял строку "0-25", но у меня возникли проблемы с выяснением этого.

@Getter
final class Range {

    @Min(0)
    private Integer offset = 0;

    @Min(1)
    private Integer limit = 25;
}
@ResponseBody
@GetMapping(params = { "range" })
public ResponseEntity<?> getAllClients(@RequestParam(value = "range", required = false) QueryRange queryRange, final HttpServletResponse response) {
    ...
}

Я не уверен, как поручить контроллеру правильно десериализовать строку "0-25" в диапазон ...

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Вы также можете сделать следующее:

public class QueryRangeEditor extends PropertyEditorSupport {

    private static final Pattern PATTERN = Pattern.compile("^([1-9]\\d*|0)-([1-9]\\d*|0)$");

    @Override
    public void setAsText(String text) throws IllegalArgumentException {

        final QueryRange range = new QueryRange();

        Matcher matcher = PATTERN.matcher(text);

        if (matcher.find()) {

            range.setOffset(Integer.valueOf(matcher.group(1)));
            range.setLimit(Integer.valueOf(matcher.group(2)));
        } else {
            throw new IllegalArgumentException("OI"); // todo - replace
        }
        setValue(range);
    }
}
@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(QueryRange.class, new QueryRangeEditor());
}

Но @ cassiomolin выглядит чище ...

0 голосов
/ 26 марта 2019

Вы можете использовать Converter<S, T>, как показано ниже:

@Component
public class RangeConverter implements Converter<String, Range> {

    @Override
    public Range convert(String source) {
        String[] values = source.split("-");
        return new Range(Integer.valueOf(values[0]), Integer.valueOf(values[1]));
    }
}

Вы также можете обрабатывать недопустимые значения в соответствии с вашими потребностями. Если вы используете вышеупомянутый преобразователь как есть, попытка преобразовать недопустимое значение, такое как 1-x, приведет к ConversionFailedException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...