Как я могу передать ApiParam в валидатор другой переменной? - PullRequest
1 голос
/ 01 ноября 2019

Я немного расстроен, и не уверен, что мне следует делать, кроме как просто отказаться от того, чтобы сделать этот Валидатор настолько всеобъемлющим, насколько мне бы того хотелось. У меня есть конечная точка, которая выглядит примерно так:

@PutMapping(value = "/v1/operation/{actionType}")
    public void operation(
        @ApiParam(value = "type", required = true, allowableValues = "retry-all, retry-parquet, re-drop")
        @PathVariable("actionType") RetryActionType actionType,

        @Null @RequestBody @Valid RetryDto retryDto
    ) throws Exception {...}

Теперь аннотация @Valid, стоящая за retryDto, представляет собой довольно конкретный валидатор, который гарантирует, что retryDto верен. Проблема заключается в том, что после недавних разработок и добавления дополнительных функций срок действия retryDto теперь зависит от actionType.

Я довольно растерян, как включить actionType в retryDto. Мои ограничения следующие:

  1. Я не могу изменить эту конечную точку. Я не могу, например, сделать actionType не ApiParam, и я не могу сделать retryDto не RequestBody. Я так не думаю, по крайней мере. Если вы можете придумать разумный способ сохранить конечную точку ("/v1/operation/{actionType}") одинаковой, принимая {actionType} в качестве ApiParam и тела запроса, но, скажем, оба они могут быть объединены в один объект длявыглядеть примерно так:

    @PutMapping(value = "/v1/operation/{actionType}")
    public void operation(
            @??? @??? @??? NewTypeThatIsActionTypeAndRetryDto x
        ) throws Exception {...}
    

    Я бы с этим согласился. Опять же, NewType... должен быть в состоянии принять ApiParam и RequestBody. Сомневаюсь, что это возможно, но я не эксперт.

  2. Я не могу заставить клиентов включать actionType в RequestBody объекта retryDto. Это не означает, что если, скажем, кто-нибудь из вас знает способ, которым я могу автоматически добавить actionType к retryDto, это было бы неприемлемо. Другими словами, я могу изменить retryDto, чтобы принимать actionType «автоматически». Само собой разумеется, что мой валидатор должен видеть это, конечно.

Я думаю, что это так. Я надеялся, что смогу как-нибудь автоматически добавить actionType к retryDto. Может быть, я могу заставить @Valid принять переменную в качестве параметра? Я почти уверен, что аннотации должны принимать константы ... но, может быть, есть какой-то способ?

Может быть, что-то еще целиком? Хотел бы услышать в ответ. Спасибо

1 Ответ

0 голосов
/ 02 ноября 2019

Для всех, кто интересуется, я понял это пару часов назад. Внутри своей функции я вызывал другую функцию, которая фактически использовала параметр retryDto. Я поместил валидатор в определение этой функции, и это сработало! Я глупо думал, что это будет работать только внутри функции API, но это было неправильно.

@PutMapping(value = "/v1/operation/{actionType}")
    public void operation(
        @ApiParam(value = "type", required = true, allowableValues = "retry-all, retry-parquet, re-drop")
        @PathVariable("actionType") RetryActionType actionType,

        @Null @RequestBody RetryDto retryDto
    ) throws Exception
    {
     ...
            retryDto.setActionType(actionType);
            retryService.retry(actionType, retryDto);
     }
public void retry(RetryActionType actionType, @Valid RetryDto retryDto)

Это сработало! Закончилось изменение retryDto, чтобы включить это, так что это было единственным предупреждением. Возможно, это не совсем верное решение, и если у кого-то есть идеи получше, сделайте это.

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