396 Stimmen

Spring MVC @PathVariable mit Punkt (.) wird abgeschnitten

Dies ist eine Fortsetzung der Frage Spring MVC @PathVariable wird abgeschnitten

Das Spring-Forum gibt an, dass es behoben wurde (Version 3.2) als Teil des ContentNegotiationManagers. Weitere Informationen finden Sie unter dem folgenden Link.
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632

In meiner Anwendung wird die Anforderungsparameter mit .com abgeschnitten.

Kann mir jemand erklären, wie man dieses neue Feature verwendet? Wie wird es in XML konfiguriert?

Hinweis: Spring-Forum- #1 Spring MVC @PathVariable mit Punkt (.) wird abgeschnitten

3voto

GuyT Punkte 4075

Ab Frühling 5.2.4 (Spring Boot v2.2.6.RELEASE) PathMatchConfigurer.setUseSuffixPatternMatch und ContentNegotiationConfigurer.favorPathExtension wurden veraltet ( https://spring.io/blog/2020/03/24/spring-framework-5-2-5-available-now und https://github.com/spring-projects/spring-framework/issues/24179).

Das eigentliche Problem ist, dass der Client einen bestimmten Medientyp anfordert (wie .com) und Spring standardmäßig all diese Medientypen hinzugefügt hat. In den meisten Fällen wird Ihr REST-Controller nur JSON produzieren, sodass er das angeforderte Ausgabeformat (.com) nicht unterstützen wird. Um dieses Problem zu lösen, sollten Sie Ihren REST-Controller (oder eine spezifische Methode) aktualisieren, um das 'output'-Format zu unterstützen (@RequestMapping(produces = MediaType.ALL_VALUE)) und natürlich Zeichen wie einen Punkt zulassen ({username:.+}).

Beispiel:

@RequestMapping(value = USERNAME, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public class UsernameAPI {

    private final UsernameService service;

    @GetMapping(value = "/{username:.+}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.ALL_VALUE)
    public ResponseEntity isUsernameAlreadyInUse(@PathVariable(value = "username") @Valid @Size(max = 255) String username) {
        log.debug("Überprüfen, ob Benutzername bereits existiert");
        if (service.doesUsernameExist(username)) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        return ResponseEntity.notFound().build();
    }
}

Spring 5.3 und höher werden nur registrierte Suffixe (Medientypen) abgleichen.

0voto

Sanjay Bharwani Punkte 2105

Wenn Sie Spring 3.2+ verwenden, wird die untenstehende Lösung helfen. Dies wird alle URLs behandeln, daher definitiv besser als die Anwendung eines Regex-Musters im Anforderungs-URI-Mapping, um . wie /somepath/{variable:.+} zu erlauben

Definieren Sie ein Bean in der XML-Datei

Die Verwendung der Flags kann in der Dokumentation gefunden werden. Ich füge einen Ausschnitt hinzu, um es zu erklären

Die Erklärung von useRegisteredSuffixPatternMatch soll das Problem lösen. Aus der Java-Dokumentation in der Klasse

Wenn aktiviert, stimmt eine Controller-Methode, die auf "/users" abgebildet ist, auch mit "/users.json" überein, vorausgesetzt ".json" ist eine Dateierweiterung, die beim bereitgestellten {@link #setContentNegotiationManager(ContentNegotiationManager) contentNegotiationManager} registriert ist. Dies kann nützlich sein, um nur spezifische URL-Erweiterungen zuzulassen sowie in Fällen, in denen ein "." im URL-Pfad zu einer mehrdeutigen Interpretation des Pfadvariableninhalts führen kann (z. B. bei "/users/{user}" und eingehenden URLs wie "/users/john.j.joe" und "/users/john.j.joe.json").

0voto

Tiago Medici Punkte 1444

Einfache Lösung: Fügen Sie ein Regex {q:.+} in den @RequestMapping hinzu

@RequestMapping("medici/james/Site")
public class WebSiteController {

    @RequestMapping(value = "/{site:.+}", method = RequestMethod.GET)
    public ModelAndView display(@PathVariable("site") String site) {
        return getModelAndView(site, "web site");

    }
}

Jetzt wird bei der Eingabe von /site/jamesmedice.com "site" die richtige James-Site anzeigen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X