Spring 中 GetMapping 的 @PathVariable 在输入为 # 时抛出错误

@PathVariable of GetMapping in Spring throws an error when the input is #

我制作了一个自动建议输入字段,可以在每次按键时自动搜索数据库。当我插入字母和数字等常规字符时它工作正常,但当您尝试使用字符 # 启动搜索请求时它会变得怪异。这样做会引发错误 org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'long'; nested exception is java.lang.NumberFormatException: For input string: "get"

当我在 # 之前添加一些字母(例如 des#)时,它将抛出 404 页面未找到错误,如果我使用 % 字符,它将抛出 400 'unauthorized' 错误。

这种奇怪的行为可能与我期待的是 GetRequest 而不是 PostRequest 有关。如果我把它变成一个 PostMapping,我相信错误会消失。但我的问题是;为什么会这样? #有什么特殊含义吗?为什么 spring 看似尝试将 # 转换为长值,即使路径变量的类型为字符串?还有为什么输入的字符串根据错误变成了"get"呢?我知道在 url 中 # 有一个特殊的含义,因为它表示一个 href 锚点,但为什么它应该是 spring 的一个特殊字符?

这是我的 getMapping 的代码

@GetMapping("/get/varietynames/{searchString}/{languageCode}")
public List<CropVarietyNameSelectionDTO> getCropVarietySelectionDTOBySearchString(@PathVariable("searchString") @NotBlank @Pattern(regexp = "^[A-Za-z0-9]+$", message = "Search input only allows for letters and numbers")
                                                                                      @Size(min = 1, max = 40, message = "Search input cannot exceed 40 characters") String searchString, @PathVariable("languageCode") String languageCode){
    return seedService.getCropVarietySelectionDTOBySearchString(searchString,languageCode);
}

编辑

前端请求为:

  private basePath:string = this.apiUrl + "/seed";
  getCropVarietySelectionDTOBySearchString(searchString: string):Observable<CropVarietyNameSelectionDTO[]>{
    return (searchString && (searchString.trim().length > 0))  ? this.http.post<CropVarietyNameSelectionDTO[]>(this.basePath + "/get/varietynames/" + this.languageService.getCodeOfPreferredLanguage(), searchString) : Observable.of([]);
  }

this.apiUrl = localhost:4200

这不是使用 @PathVariable annotation which indicates that a method parameter should be bound to a URI template variable. You need to use @RequestParam annotation which indicates that a method parameter should be bound to a web request parameter. You can see this answer 的正确方法或选项,它是 @RequestParam vs @PathVariable

@GetMapping("/get/varietynames")
public List<CropXXXDTO> getXXXXXhString(@RequestParam @NotBlank 
       @Pattern(regexp = "^xx+$", message = "xxxxx")                                                                                  
       @Size(min = 1, max = 40, message = "xxxxx") String searchString, 
       @RequestParam(required = false, defaultValue = "EN") String languageCode){
    return seedService.getXXXXtring(searchString, languageCode);
}

然后您可以通过以下方式查看URL:

/get/varietynames?searchString=XXXXX&languageCode=EN