Die API-Versionierungsfunktion von Spring Framework 7 (Spring Boot 4) verhält sich nicht wie erwartetJava

Java-Forum
Anonymous
 Die API-Versionierungsfunktion von Spring Framework 7 (Spring Boot 4) verhält sich nicht wie erwartet

Post by Anonymous »

Ich versuche, die neue API-Versionierungsfunktion zu verstehen, die in Spring 7 eingeführt wurde, und habe den Eindruck, dass etwas nicht stimmt. Wenn die Versionierung aktiviert ist und in der Handler-Methode kein Versionsattribut angegeben ist, wird sie gemäß der Spring-Dokumentation als (nicht versioniert) als Übereinstimmung mit einer beliebigen (unterstützten) Version betrachtet.

Sobald die API-Versionierung aktiviert ist, können Sie damit beginnen, Anforderungen mit
Versionen zuzuordnen. Das @RequestMapping-Versionsattribut unterstützt Folgendes:
Kein Wert  –  stimmt mit jeder Version überein
Feste Version („1.2“) –  stimmt nur mit der angegebenen Version überein
Basisversion („1.2+“) –  stimmt mit der angegebenen Version und höher überein

Überprüfen Sie die angeschlossener Controller und die Eigenschaftendatei.
SampleController.java

Code: Select all

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

Code: Select all

trace                                  = true

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

// added this just to explain the behaviour
spring.mvc.apiversion.supported        = 100, 200
Ich habe eine URI-Pfad-basierte Versionierung mit zwei Handler-Methoden implementiert. Eine mit einer bestimmten Version und die andere ohne Version (kein Versionsattribut angegeben).
Ich erwarte daher, dass sich die folgenden Anfragen wie folgt verhalten:
Anfrage-1:

Code: Select all

http://localhost:8080/api/v1/data
sollte „Version 1“ zurückgeben, da es eine exakte Übereinstimmung ist
Request-2:

Code: Select all

http://localhost:8080/api/v100/data
sollte „unversioned“ zurückgeben, da es keine genaue Versionsübereinstimmung gibt und die unversioned()-Methode aufgerufen werden sollte, aber das ist nicht der Fall, stattdessen gibt sie eine 400 Bad Request zurück.
Antwort:

Code: Select all

There was an unexpected error (type=Bad Request, status=400).
Ich habe ein wenig debuggt und festgestellt, dass die Methode „lookupHandlerMethod()“ in „AbstractHandlerMethodMapping.java“ zwei Übereinstimmungen für die Anforderung GET /api/v100/data erhält und die Handler-Methode mit dem als beste Übereinstimmung angegebenen Versionsattribut auswählt, was nicht korrekt ist.
Übereinstimmungen:
  • Code: Select all

    {GET [/api/{version}/data]}
    --> sollte dies als beste Übereinstimmung betrachten
  • Code: Select all

    {GET [/api/{version}/data], version [v1.0.0]}
    --> Dies ist nicht die beste Übereinstimmung, aber das Framework wählt dies als beste Übereinstimmung aus.
Konsolenprotokoll:

Code: Select all

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'."]
Image

Image

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post