@PathVariable из GetMapping в Spring выдает ошибку, когда ввод # - PullRequest
1 голос
/ 28 октября 2019

Я создал поле ввода с автозаполнением, которое автоматически ищет базу данных при каждом нажатии клавиши. Он отлично работает, когда я вставляю обычные символы, такие как буквы и цифры, но становится пугающим, когда вы пытаетесь начать поисковый запрос с символа #. Это приводит к ошибке 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 'несанкционированная ошибка.

Это странное поведение, вероятно, связано с тем, что я ожидаю получить GetRequest вместо PostRequest. Если я превращу его в PostMapping, я уверен, что ошибки исчезнут. Но мой вопрос таков;почему это происходит? Есть ли у # особый смысл? Почему Spring, по-видимому, пытается преобразовать # в длинное значение, даже если переменная пути указана как String? И почему входная строка стала "get" в соответствии с ошибкой? Я знаю, что в URL-адресе есть особое значение в том смысле, что он обозначает якорь href, но почему он должен быть специальным символом для весны?

Вот код моего 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

1 Ответ

1 голос
/ 28 октября 2019

Это неправильный способ или опция для использования @ PathVariable аннотации, которая указывает, что параметр метода должен быть связан с переменной шаблона URI. Вам необходимо использовать аннотацию @ RequestParam , которая указывает, что параметр метода должен быть привязан к параметру веб-запроса. Вы можете увидеть этот ответ , то есть @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
...