web-dev-qa-db-ja.com

URLにスラッシュを含むSpring Bootの@PathVariable

SpringBootアプリケーションで@PathValiableを使用してURLからパラメーターを取得する必要があります。多くの場合、これらのパラメーターにはスラッシュが含まれています。ユーザーがURLに何を入力するかを制御できないので、ユーザーが入力したものを取得し、それを処理できます。

ここで既に資料と回答を確認しましたが、私に良い解決策はユーザーに入力パラメータを何らかの方法でエンコードするよう依頼することであるとは思いません。

SpringBootコードは単純です。

@RequestMapping("/modules/{moduleName}")
@ResponseBody
public String moduleStrings (@PathVariable("moduleName") String moduleName) throws Exception {

  ...

}

たとえば、URLは次のようになります。

http://localhost:3000/modules/...

問題は、param moduleNameにスラッシュが含まれていることが多いことです。例えば、

metadata-api\cb-metadata-services OR
app-customization-service-impl\\modules\\expand-link-schemes\\common\\app-customization-service-api

したがって、ユーザーは明確に次のように入力できます。

http://localhost:3000/modules/metadata-api\cb-metadata-services

/ modules /の後にユーザーがURLに入力したものすべてを取得することは可能ですか?

誰かが私にそのような問題を処理するための良い方法は何であるかを教えたら。

12
Kirill Ch

このコードは完全なパスを取得します。

@RequestMapping(value = "/modules/{moduleBaseName}/**", method = RequestMethod.GET)
@ResponseBody
public String moduleStrings(@PathVariable String moduleBaseName, HttpServletRequest request) {
    final String path =
            request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
    final String bestMatchingPattern =
            request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();

    String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path);

    String moduleName;
    if (null != arguments && !arguments.isEmpty()) {
        moduleName = moduleBaseName + '/' + arguments;
    } else {
        moduleName = moduleBaseName;
    }

    return "module name is: " + moduleName;
}
12
P.J.Meisch

P.J. Meischの答えに基づいて、私は私のケースの簡単な解決策を見つけました。また、URLパラメータで数個のスラッシュを考慮することもできます。前の回答のようにバックスラッシュを使用することもできません。

@RequestMapping(value = "/modules/**", method = RequestMethod.GET)
@ResponseBody
public String moduleStrings(HttpServletRequest request) {

    String requestURL = request.getRequestURL().toString();

    String moduleName = requestURL.split("/modules/")[1];

    return "module name is: " + moduleName;

}
8
Kirill Ch