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

6voto

Paul Arer Punkte 185

Die vollständige Lösung einschließlich E-Mail-Adressen in Pfadnamen für Frühling 4.2 lautet:

            json=application/json
            xml=application/xml

Fügen Sie dies zur application-xml hinzu

5voto

Jukka Punkte 4525

Wenn Sie Spring 3.2.x verwenden und , erstellen Sie diesen kleinen BeanPostProcessor:

package spring;

public final class DoNotTruncateMyUrls implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof RequestMappingHandlerMapping) {
            ((RequestMappingHandlerMapping)bean).setUseSuffixPatternMatch(false);
        }
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

Dann fügen Sie dies in Ihre MVC-Konfigurations-XML ein:

5voto

luboskrnac Punkte 22427

Endlich habe ich die Lösung in Spring Docs gefunden:

Um die Verwendung von Dateierweiterungen vollständig zu deaktivieren, müssen Sie beide der folgenden Einstellungen vornehmen:

 useSuffixPatternMatching(false), siehe PathMatchConfigurer

 favorPathExtension(false), siehe ContentNegotiationConfigurer

Das Hinzufügen dieser Einstellungen zu meiner WebMvcConfigurerAdapter-Implementierung hat das Problem gelöst:

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false);
}

@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
    matcher.setUseSuffixPatternMatch(false);
}

5voto

rogerdpack Punkte 55995

Für mich funktioniert das

@GetMapping(path = "/a/{variableName:.+}")

aber nur, wenn der "Punkt" in der Anfrage-URL auch als "%2E" codiert ist, dann funktioniert es. Aber es erfordert, dass alle URLs so sind... was keine "Standard"-Codierung ist, aber gültig. Fühlt sich wie ein Bug an :|

Der andere Workaround, ähnlich wie bei der Methode mit dem "Schrägstrich am Ende", ist es, die Variable, die den Punkt haben wird, "inline" zu platzieren, zum Beispiel:

@GetMapping(path = "/{variableName}/a")

jetzt werden alle Punkte erhalten bleiben, keine Modifikationen erforderlich.

4voto

Silvio Araujo Punkte 71

Wenn Sie sowohl Back-End als auch Front-End schreiben, ist eine weitere einfache Lösung, am Ende der URL vorne ein "/" anzuhängen. Wenn Sie das tun, müssen Sie Ihr Backend nicht ändern...

somepath/myemail@gmail.com/

Sei glücklich!

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