Die Werte von @PathVariable und @ModelAttribute überschneiden sich
ich habe einUser
Objekt in der Sitzung mit gespeichert@SessionAttributes
. Und eine unkomplizierte Methode, dekoriert mit@ModelAttribute
um es zu initialisieren, wenn der Wert der Sitzung null ist.
Benutzerklasse:
@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;
}
...
Regler:
@RequestMapping("/item")
@Controller
@SessionAttributes({"user"})
public class MyController {
@ModelAttribute-Methode:
@ModelAttribute("user")
public User createUser(Principal principal) {
return userService.findByUsername(principal.getName());
}
Es scheint alles wie erwartet zu funktionieren, außer in dieser speziellen Methode:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String showItem(@PathVariable("id") Long id, @ModelAttribute("user") User user,
Model uiModel) {
...
}
Das Problem ist, dassUser.id
wird eingestellt mit@PathVariable("id")
. Ich glaube, ich bin damit in Berührung gekommen@RequestParam
auch. Ich nehme an, das liegt daran, dass beide den gleichen Namen und Typ haben. Nach dem LesenSpring's Dokumentation (siehe unten) Ich gehe davon aus, dass dies erwartet wird:
Der nächste Schritt ist die Datenbindung. Die WebDataBinder-Klasse vergleicht Anforderungsparameternamen - einschließlich Abfragezeichenfolgenparametern und Formularfeldern -, um Attributfelder nach Namen zu modellieren. Übereinstimmende Felder werden ausgefüllt, nachdem die Typkonvertierung (von String in den Zielfeldtyp) bei Bedarf angewendet wurde.
Ich würde jedoch denken, dass dieses Szenario ziemlich häufig ist. Wie gehen andere damit um? Wenn meine Ergebnisse korrekt sind und dies erwartetes Verhalten (oder Fehler) ist, scheint dies sehr fehleranfällig zu sein.
Mögliche Lösungen:
Veränderung@PathVariable("id")
zu@PathVariable("somethingElse")
. Funktioniert, ist aber bei @RequestParam nicht so einfach (z. B. kann ich die Anforderungsparameter-ID von jqgrid nicht in eine andere ID ändern, dies ist jedoch ein anderes Problem).Veränderung@PathVariable("id")
Typ von Long bis Int. Das wird machenUser.id
undid
Typen unterscheiden sich aber die Besetzung zu Long sieht hässlich aus :)Nicht verwenden@ModelAttribute
hier und fragen Sie die DB nachUser
nochmal. Nicht konsistent mit anderen Methoden und beinhaltet redundante DB-Aufrufe.Irgendwelche Vorschläge?