Spring Framework 7 (Spring Boot 4) Функция управления версиями API не работает должным образомJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Framework 7 (Spring Boot 4) Функция управления версиями API не работает должным образом

Сообщение Anonymous »

Я пытаюсь понять новую функцию управления версиями API, представленную в Spring 7, и кажется, что что-то не так. Согласно документации Spring, если управление версиями включено и в методе-обработчике не указан атрибут версии, то он считается (неверсионным) соответствующим любой (поддерживаемой) версии.

После включения управления версиями API вы можете начать сопоставлять запросы с
версиями. Атрибут версии @RequestMapping поддерживает
следующее:
Нет значения — соответствует любой версии.
Фиксированная версия ("1.2") — соответствует только заданной версии.
Базовая версия ("1.2+") — соответствует данной версии и выше

Проверьте подключенный контроллер и файл свойств.
SampleController.java

Код: Выделить всё

package com.example;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/{version}/data")
public class SampleController {

@GetMapping
public String unversioned() {
return "unversioned";
}

@GetMapping(version = "v1.0.0")
public String version1() {
return "version 1";
}
}
application.properties

Код: Выделить всё

trace                                  = true

spring.mvc.apiversion.use.path-segment = 1

// added this just to explain the behaviour
spring.mvc.apiversion.supported        = 100, 200
Я реализовал управление версиями на основе пути URI с двумя методами-обработчиками. Один с определенной версией, а другой без какой-либо версии (атрибут версии не указан).
Поэтому я ожидаю, что приведенные ниже запросы должны вести себя следующим образом:
Запрос-1:

Код: Выделить всё

http://localhost:8080/api/v1/data
должен вернуть «версию 1», так как это точное совпадение.
Запрос-2:

Код: Выделить всё

http://localhost:8080/api/v100/data
должен возвращать «неверсионный», поскольку точного совпадения версий нет, и должен быть вызван метод unversioned(), но это не так, вместо этого он возвращает 400 Bad Request.
Ответ:

Код: Выделить всё

There was an unexpected error (type=Bad Request, status=400).
Я провел небольшую отладку и обнаружил, что метод LookupHandlerMethod() в AbstractHandlerMethodMapping.java получает два совпадения для запроса GET /api/v100/data и выбирает метод обработчика с атрибутом версии, указанным как наилучшее совпадение, что неверно.
Соответствует:
  • Код: Выделить всё

    {GET [/api/{version}/data]}
    --> следует считать это лучшим соответствием
  • Код: Выделить всё

    {GET [/api/{version}/data], version [v1.0.0]}
    --> это не лучшее совпадение, но платформа считает его лучшим.
Журнал консоли:

Код: Выделить всё

2025-12-29T16:34:36.750+05:30 TRACE 88093 --- [spring-boot-api-versioning-101] [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : GET "/api/v100/data", parameters={}, headers={masked} in DispatcherServlet 'dispatcherServlet'
2025-12-29T16:34:36.752+05:30 TRACE 88093 --- [spring-boot-api-versioning-101] [nio-8080-exec-4] s.w.s.m.m.a.RequestMappingHandlerMapping : 2 matching mappings: [{GET [/api/{version}/data], version [v1.0.0]}, {GET [/api/{version}/data]}]
2025-12-29T16:34:36.752+05:30  WARN 88093 --- [spring-boot-api-versioning-101] [nio-8080-exec-4] .w.s.m.a.ResponseStatusExceptionResolver : Resolved [org.springframework.web.accept.NotAcceptableApiVersionException: 400 BAD_REQUEST "Invalid API version: '100.0.0'."]
Изображение

Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... as-expecte
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»