Весенняя аннотация @Validated не работает в классе kotlin, работает тот же код java - PullRequest
0 голосов
/ 08 января 2020

У меня есть kotlin запрос на получение. Проверка не работает, можно указать день недели для более или менее допустимых ограничений

@RestController
@Validated
open class GetCrab {
    @GetMapping("/v1/get")
open fun getNameOfDayByNumber(@RequestParam dayOfWeek: @Min(1) @Max(7) Int?): String {
        return "ok"
    }
}

В том же java проверка кода работает

@RestController
@Validated
public class GetCrab {

    @GetMapping("/v1/get")
    public String getNameOfDayByNumber(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) {

        return "ok";
    }
}

Java код, когда проверка работает : запрос:

http://localhost: 12722 / v1 / get? dayOfWeek = 100

Ответ ->

{
"errors": [
    {
        "code": "INTERNAL_SERVER_ERROR",
        "details": "getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7"
    }
]

}

Kotlin код, запрос http://localhost: 12722 / v1 / get? DayOfWeek = 100

Ответ:

ok

1 Ответ

1 голос
/ 08 января 2020

Пожалуйста, используйте open модификатор для методов тоже.

Например, пожалуйста, попробуйте код:

@RestController
@Validated
open class GetCrab {
    @GetMapping("/v1/get")
    open fun getNameOfDayByNumber(@RequestParam dayOfWeek: @Min(1) @Max(7) Int?): String {
        return "ok"
    }
}

И класс, и метод должны быть open (в терминах Java - оба из них не должно быть окончательным), из-за логики Spring proxy c. Из связанной статьи: Spring пытается унаследовать ваш класс, потому что иногда вы можете запросить точный ваш класс из параметра @Autowired.

По умолчанию все классы и методы не являются окончательными в Java. Однако Kotlin классы / методы являются окончательными по умолчанию , поэтому перед ними необходимо поставить ключевое слово open, чтобы иметь возможность переопределения.

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