@PathVariable не работает с нелатинским языком - PullRequest
0 голосов
/ 04 октября 2019

У меня есть метод контроллера, который получает сообщение из базы данных.

@RequestMapping(value = {"/post/{id}", "/post/{id}/{title}"}, method = RequestMethod.GET)

, и таблица сообщений выглядит в базе данных следующим образом:

  • id
  • title
  • description
  • slug

при получении запроса GET на получение сообщения из базы данных, я получаю сообщение из базы данных и проверяю,title slug в URL совпадает с slug в базе данных, если они будут одинаковыми, я буду отображать его, а если нет, я перенаправлю запрос на тот же метод с slug из базы данных.

Я попробовал следующий код

@RequestMapping(value = {"/post/{id}", "/post/{id}/{title}"}, method = RequestMethod.GET)
public String getPost(@PathVariable("id") Long id, 
        @PathVariable("title") Optional<String> title,
        Model model,
        HttpServletRequest request) {

    Optional<PostDTO> postDTO = postService.findOne(id);
    if(postDTO.isPresent()) {
        String slug = postDTO.get().getSlug();

        model.addAttribute("post", postDTO.get());

        if( (title.isPresent() && !slug.equals(title.get())) || !title.isPresent()) {
            // redirect
            return "redirect:/post/" + postDTO.get().getId() + "/" + slug;
        } else {
            return "post/index";
        }
    } else {
        return "post/not_found";
    }
}

, но когда он достигает оператора перенаправления, идентификатор отправляется, но заголовок равен нулю, поэтому я получаю бесконечный цикл.

Что я сделал не так?

ОБНОВЛЕНИЕ:

после некоторой отладки я обнаружил, что мой код работает нормально, если текст, хранящийся в переменной slug, был английским, но если это былоАрабский это будет ноль.

return "redirect:/post/" + postDTO.get().getId() + "/" + slug;

return "redirect:/post/" + postDTO.get().getId() + "/" + "Hello"; // working fine
return "redirect:/post/" + postDTO.get().getId() + "/" + "مرحبا"; // not working

не работает означает, что @PathVariable("title") Optional<String> title будет нулевым после перенаправления.

...