Pull to refresh

Comments 7

Spring Boot 2 и JDK 8: Вы все еще используете аннотации Param, @RequestParam и @PathVariable?

без обид, но похоже вы были последним человеком кто так делал :)
на сколько помню ещё со времён JDK7 и спринга версии 4 можно было не дублировать названия параметров.

Да не один, судя по примерам в google. Вот пример с @PathVariable всем известного проекта: https://github.com/spring-projects/spring-petclinic/blob/master/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java
Так может поделитесь, как это в JDK7 работало?

была какая-то библиотека, которая сохраняла названия параметров метода при компиляции. с JDK8 это стал делать javac
Вы удивитесь, но @RequestParam/@PathVariable все еще нужна чтобы отметить параметр как mandatory, что в свою очередь сгенерит ошибку, если вы не передаете параметр в запросе.

{
	"timestamp": "2019-02-15T13:42:53.511+0000",
	"status": 400,
	"error": "Bad Request",
	"message": "Required long parameter 'id' is not present",
	"path": "/"
}

Не удивлен. Но спасибо за замечание, написал UPDATE: аннотации @PathVariable и @RequestParam все еще часто нужны, чтобы приложение работало корректно. Но их атрибуты value/name уже не обязательны: соответствие ищется по именам переменных.

UPDATE 2: интересно, что для для @RequestParam и @PathVariableвторая работает вторая стратегия LocalVariableTableParameterNameDiscoverer на основе информации, полученной ASM из байткода. В том числе и для обычного Spring (без Boot) и без параметра компиляции.

Спасибо за статью. В свое время наткнулся на аналогичную проблему — в моем случае интерес вызвал тест, который успешно проходил в gradle test, но не через idea. Любопытство взяло верх и в итоге я все же нашел в недрах spring-boot плагина нечто аналогичное parent pom, что Вы дали в своем примере.
В итоге стало ясно что нужно либо добавить значение атрибута value/name для аннотаций RequestParam/PathVariable, либо добавить настройку компиляции (-parameters) в idea.
Что касается совета не использовать значение атрибута аннотаций, полагаясь на название локальной переменной — я все же придерживаюсь более традиционного решения (использовать). Во-первых, это работает независимо от настроек компиляции проекта (idea при импорте gradle spring-boot проекта не применяет параметр parameters=true к javac). Во-вторых, локальная переменная (аргумент метода) интуитивно рассматривается как что-то, что можно без последствий переименовать, как private-метод, например. А если по какой-то причине это делать нельзя, желательно либо оставлять пометки в коде вроде комментария, но здесь проще дать значение атрибуту. Либо подстраховываться интеграционным тестом, который этот самый параметр передает (ну тест это само собой must have). В общем, это IMHO конечно.

Only those users with full accounts are able to leave comments. Log in, please.