Spring MVC Anwendung: Verbindliche viele-zu-viele-list-Objekt in form
Mein Spring MVC web-Anwendung macht Gebrauch von zwei Modell-Klassen Spieler und Mannschaft. Es ist ManyToMany Beziehung zwischen Spieler und Team. Hier sind die Modell-Klassen.
@Entity
@Table(name="TEAMS")
public class Team {
@Id
@Column(name="ID")
private int id;
@Column(name="NAME")
@Size(min=2, max=30)
private String name;
@ManyToMany(mappedBy="teams")
private Set<Player> players = new HashSet<Player>();
//getter and setter methods
}
@Entity
@Table(name="PLAYERS")
public class Player {
@Id
@Column(name="ID")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="players_seq")
@SequenceGenerator(name="players_seq", sequenceName="PLAYERS_SEQ")
private int id;
@Column(name="LASTNAME")
@Size(min=2, max=30)
private String lastname;
@Column(name="FIRSTNAME")
@Size(min=2, max=30)
private String firstname;
@Column(name="BIRTHDAY")
@DateTimeFormat(pattern="MM/dd/yyyy")
@NotNull @Past
private Date dob;
@Column(name="PLAYING_ROLE")
@NotNull
private String playingRole;
@ManyToMany(cascade =CascadeType.ALL)
@JoinTable(name="TEAM_PLAYER",
joinColumns={@JoinColumn(name="PLAYER_ID")},
inverseJoinColumns={@JoinColumn(name="TEAM_ID")})
private Set<Team> teams = new HashSet<Team>();
//getter and setters
}
Ich versuche mich zu ordnen-team auf Spieler mit Hilfe der Checkboxen und meine JSP sieht wie folgt aus
<table>
<form:form modelAttribute="player" method="POST"
action="${editPlayer }">
<tr>
<td>Last name:</td>
<td><form:input path="lastname" /> <form:errors
path="lastname" cssStyle="color:red;" /></td>
</tr>
<tr>
<td>First Name:</td>
<td><form:input path="firstname" /> <form:errors
path="firstname" cssStyle="color:red;" /></td>
</tr>
<tr>
<td>Birthday:</td>
<td><form:input path="dob" /> <form:errors path="dob"
cssStyle="color:red;" /></td>
</tr>
<tr>
<td>Playing Style:</td>
<td><form:input path="playingRole" /> <form:errors
path="playingRole" cssStyle="color:red;" /></td>
</tr>
<tr>
<td>Teams:</td>
<td><form:checkboxes items="${teams}" path="teams"
itemValue="id" itemLabel="name" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Update Player" /></td>
</tr>
</form:form>
</table>
Meine PlayerController.java sieht so aus
@Controller
public class PlayerController {
@Autowired
private PlayerService playerService;
@Autowired
private TeamService teamService;
@ModelAttribute("teams")
public List<Team> getTeams(){
return teamService.getTeams();
}
@RequestMapping(value="/player/edit/{id}", method=RequestMethod.GET)
public ModelAndView updatePlayerPage(@PathVariable int id){
Player player = playerService.getPlayer(id);
ModelAndView modelAndView = new ModelAndView("player/edit");
modelAndView.addObject("player", player);
return modelAndView;
}
@RequestMapping(value="/player/edit/{id}", method=RequestMethod.POST)
public ModelAndView updatePlayer(@ModelAttribute @Valid Player player, BindingResult result, @PathVariable int id){
if(result.hasErrors()){
System.out.println("HAS ERRORS!. Number of errors: "+result.getAllErrors().size());
for(Object o : result.getAllErrors()){
System.out.println(o);
}
System.out.println("\n Player details: "+ player );
return new ModelAndView("player/edit");
}
playerService.updatePlayer(player);
ModelAndView modelAndView = new ModelAndView("home");
String message = "Player updated successfully";
modelAndView.addObject("message", message);
return modelAndView;
}
//it has got some other methods also that does some other functionality
}
JSP-Seite wird immer richtig dargestellt, aber wenn ich versuche zu speichern, erhalte ich die exception
Field error in object 'player' on field 'teams': rejected value [5050]; codes [typeMismatch.player.teams,typeMismatch.teams,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [player.teams,teams]; arguments []; default message [teams]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'teams'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.sunil.model.Team] for property 'teams[0]': no matching editors or conversion strategy found]
Grund für die Ausnahme ist, dass ich zuweisen müssen Team-Player, aber ich bin nicht sicher, wie dies zu tun. Kann mir bitte jemand helfen heraus, wie diese zu lösen.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie @RequestBody zu Kodieren form Daten zu json und schickte es an Ihre controller-Methode
public ModelAndView updatePlayer(@RequestBody @Valid Player player
OK, schließlich war ich in der Lage, es zu lösen.. ich hoffe, es wäre hilfreich für andere..
Ich aktualisiert JSP-Seite
Zog ich aus dem Kontrollkästchen, um Sie Auszuwählen. Grund für diese änderung ist, dass (ich fühlte mich) wäre es hilfreich für den Endbenutzer zu tun mehrere wählen Sie aus dem dropdown-Menü.
Machte ich paar updates zu meinem Controller.
Mein Select ermöglicht die Verwendung von teamsCache (Attribut items in der form:select)
Ich hoffe, es wäre nützlich für andere. Auch bitte lassen Sie mich wissen, ob es irgendwelche bessere Lösungen.
Dank