У меня есть метод контроллера, который получает сообщение из базы данных.
@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
будет нулевым после перенаправления.