1

我制作了一个自动提示输入字段,可以在每次按键时自动搜索数据库。当我插入常规字符(如字母和数字)时,它工作正常,但当您尝试使用字符 # 开始搜索请求时,它会变得怪异。这样做会引发错误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 page not found 错误,如果我使用 % 字符,它将抛出 400 'unauthorized' 错误。

这种奇怪的行为可能与我期待 GetRequest 而不是 PostRequest 有关。如果我把它变成一个 PostMapping 我相信错误会消失。但我的问题是;为什么会这样?# 有特殊含义吗?为什么即使 pathvariable 类型为 String,spring 似乎也试图将 # 转换为 long 值?为什么输入字符串根据错误变成了“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 = 本地主机:4200

4

1 回答 1

1

这不是使用@PathVariable注释的正确方法或选项,它指示方法参数应绑定到 URI 模板变量。您需要使用@RequestParam注释,它指示方法参数应绑定到 Web 请求参数。你可以看到这个答案@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
于 2019-10-28T03:05:51.637 回答