我有一个控制器方法,可以从数据库中获取帖子。
@RequestMapping(value = {"/post/{id}", "/post/{id}/{title}"}, method = RequestMethod.GET)
,数据库中的发布表如下所示:
当我收到一个GET请求以从数据库中获取帖子时,我从数据库中获取该帖子并检查URL中的标题段是否与数据库中的段匹配,如果相同,我将显示它,并且不,我将把请求重定向到与数据库中的段相同的方法。
我尝试了以下代码
@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";
}
}
但是当到达重定向语句时,将发送id,但标题为null,因此我遇到了无限循环。
我做错了什么?
更新:
经过一些调试后,我发现如果存储在slug变量中的文本为英语,则我的代码可以正常工作,但是如果为阿拉伯语,则为null。
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
在重定向后将为空。