RedirectAttributes更改控制器之间的对象ID

时间:2014-10-27 14:55:59

标签: spring-mvc java-ee

我在我的项目中使用Spring MVC和Hibernate。此外,我有2个控制器UserControllerBookController,其中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

你有没有想到为什么会发生这种情况或者它是一个错误?感谢。

1 个答案:

答案 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