Spring MVCのドット(. )付き@PathVariableは切り捨てられます

Spring MVC @PathVariableのドット(。)は切り捨てられます

1. 概要

この短いチュートリアルでは、Spring MVCを使用する際の一般的な問題であるwhen using a Spring @PathVariable with a @RequestMapping to map the end of a request URI that contains a dot, we’ll end up with a partial value in our variable, truncated at the last dot.について説明します。

次のセクションでは、これが発生する理由と、この動作を変更する方法に焦点を当てます。

Spring MVCの概要については、to this articleを参照してください。

2. 不要な春のヘルプ

フレームワークは、パス変数を解釈する方法が原因で、この望ましくない動作を引き起こすことがあります。

具体的には、.json.xml.などのSpring considers that anything behind the last dot is a file extension

その結果、値を切り捨ててパラメーターを取得します。

パス変数の使用例を見てから、さまざまな可能な値で結果を分析してみましょう。

@RestController
public class CustomController {
    @GetMapping("/example/{firstValue}/{secondValue}")
    public void example(@PathVariable("firstValue") String firstValue,
      @PathVariable("secondValue") String secondValue) {
        // ...
    }
}

上記の例で、次のリクエストを検討し、変数を評価しましょう。

  • URLexample/gallery/linkは、firstValue =の「ギャラリー」とsecondValue =の「リンク」を評価します。

  • example/gallery.df/link.ar URLを使用すると、firstValue =“ gallery.df”およびsecondValue =“ link”になります

  • example/gallery.df/link.com.ar URLの場合、変数は次のようになります:firstValue =“ gallery.df”およびsecondValue =“ link.com”

ご覧のとおり、最初の変数は影響を受けませんが、2番目の変数は常に切り捨てられます。

3. ソリューション

この不便を解決する1つの方法は、modify our @PathVariable definition by adding a regex mappingです。 これにより、最後のドットを含むすべてのドットがパラメーターの一部と見なされます。

@GetMapping("/example/{firstValue}/{secondValue:.+}")
public void example(
  @PathVariable("firstValue") String firstValue,
  @PathVariable("secondValue") String secondValue) {
    //...
}

この問題を回避する別の方法は、adding a slash at the end of our @PathVariableによるものです。 これにより、Springのデフォルトの動作から保護する2番目の変数が含まれます。

@GetMapping("/example/{firstValue}/{secondValue}/")

上記の2つのソリューションは、変更する単一のリクエストマッピングに適用されます。

グローバルMVCレベルで動作を変更する場合は、アプリケーションコンテキストで独自のDefaultAnnotationHandlerMapping Beanとsetting its useDefaultSuffixPattern property to false: を宣言することにより、SpringMVC構成をカスタマイズできます。

@Configuration
public class CustomWebConfiguration extends WebMvcConfigurationSupport {

    @Bean
    public RequestMappingHandlerMapping
      requestMappingHandlerMapping() {

        RequestMappingHandlerMapping handlerMapping
          = super.requestMappingHandlerMapping();
        handlerMapping.setUseSuffixPatternMatch(false);
        return handlerMapping;
    }
}

このアプローチはすべてのURLに影響することを覚えておく必要があります。

これらの3つのオプションを使用すると、同じ結果が得られます。example/gallery.df/link.com.ar URL, oursecondValue変数を呼び出すと、「link.com.ar」と評価されます。 、それが私たちが望むものです。

4. 結論

この簡単な記事では、Spring MVCで@PathVariable@RequestMappingを操作する際の一般的な問題と、この問題の原因を解決するためのさまざまな方法について説明しました。

いつものように、例の完全なソースコードはover on GitHubで入手できます。