Wartości nakładających się @PathVariable i @ModelAttribute
mamUser
obiekt przechowywany w sesji z@SessionAttributes
. I prosta metoda ozdobiona@ModelAttribute
w celu zainicjowania go, gdy wartość sesji jest null.
Klasa użytkownika:
@Entity
@Table( name="USER")
public class User implements java.io.Serializable {
private Long id;
private String username;
private String password;
....
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name ="ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
...
Kontroler:
@RequestMapping("/item")
@Controller
@SessionAttributes({"user"})
public class MyController {
Metoda @ModelAttribute:
@ModelAttribute("user")
public User createUser(Principal principal) {
return userService.findByUsername(principal.getName());
}
Wszystko wydaje się działać zgodnie z oczekiwaniami, z wyjątkiem tej konkretnej metody:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String showItem(@PathVariable("id") Long id, @ModelAttribute("user") User user,
Model uiModel) {
...
}
Problemem jestUser.id
jest ustawiany za pomocą@PathVariable("id")
. Wierzę, że na to wpadłem@RequestParam
zbyt. Zakładam, że to dlatego, że oba mają tę samą nazwę i typ. Po przeczytaniuDokumentacja wiosenna (patrz poniżej) Zakładam, że jest to oczekiwane zachowanie:
Następnym krokiem jest powiązanie danych. Klasa WebDataBinder dopasowuje nazwy parametrów żądania - w tym parametry ciągu zapytania i pola formularza - do modelowania pól atrybutów według nazwy. Pola dopasowania są zapełniane po konwersji typu (z typu String na typ pola docelowego) w razie potrzeby.
Myślę jednak, że ten scenariusz jest dość powszechny, w jaki sposób inni ludzie to obsługują? Jeśli moje ustalenia są poprawne i jest to oczekiwane zachowanie (lub błąd), wydaje się to bardzo podatne na błędy.
Możliwe rozwiązania:
Zmiana@PathVariable("id")
do@PathVariable("somethingElse")
. Działa, ale nie jest tak proste z @RequestParam (np. Nie wiem, jak zmienić identyfikator parametru żądania jqgrid na coś innego, ale to jest inny problem).Zmiana@PathVariable("id")
wpisz od Long do Int. To sprawiUser.id
iid
typy różnią się, ale rzut na Long wygląda brzydko :)Nie używaj@ModelAttribute
tutaj i zapytaj DB oUser
jeszcze raz. Nie jest zgodny z innymi metodami i wymaga nadmiarowych wywołań DB.Jakieś sugestie?