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?

questionAnswers(2)

yourAnswerToTheQuestion