我在我的项目中使用Spring MVC和Hibernate。此外,我有2个控制器UserController
和BookController
,其中BookController
重定向到用户页面,我还传递了一个Book
对象。
我发现我可以使用RedirectAttributes
执行此操作,但问题是在过渡到id
期间,已传递的Book
对象的user.id
已更改。< / p>
BookController.java
public class BookController {
@RequestMapping("/users/{user_id}/books/edit/{book_id}")
public String editBook(@PathVariable("user_id") int user_id, @PathVariable("book_id") int book_id, final RedirectAttributes redirectAttrs){
bookDetail = this.bookService.getBookById(book_id)
redirectAttrs.addFlashAttribute("bookDetail", bookDetail);
System.out.println(bookDetail);
return "redirect:/users/"+user_id;
}
}
打印: id = 8,title = Motylek,description = some description,user_id = 2 。
UserController.java
public class UserController {
@RequestMapping("/users/{id}")
public String detailUser(@ModelAttribute("bookDetail") Book bookDetail, @PathVariable("id") int id, Model model){
User u = this.userService.getUserById(id);
model.addAttribute("user", u);
model.addAttribute("bookDetail", bookDetail);
System.out.println(bookDetail);
return "user";
}
}
打印: id = 2,title = Motylek,description = some description,user_id = 2 。
你有没有想到为什么会发生这种情况或者它是一个错误?感谢。
答案 0 :(得分:1)
我将假设您的Book
类有一个名为id
的属性,即。一个名为getId()
和setId(..)
的getter或setter。
当Spring解析请求URL时,它会存储相应@RequestMapping
中声明的路径段。
/your-app/users/2
和
@RequestMapping("/users/{id}")
它将存储
id=2
作为请求参数。
然后Spring将继续为
生成一个参数@ModelAttribute("bookDetail") Book bookDetail
它将检查名称为bookDetail
的条目的各种请求,会话,servlet属性。 (如果找不到,则会创建一个并将其添加到请求属性中。)在您的情况下,它将在HttpSession
中找到该对象。然后它将任何请求参数绑定到匹配的对象属性。由于上面的参数称为id
,因此它将绑定到Book
属性id
。
你应该善于改变
@RequestMapping("/users/{id}")
到
@RequestMapping("/users/{user_id}")
以及相应的@PathVariable
。