Hallo zusammen.
Kurz zu dem was ich vorhabe :
Ich möchte gerne einen User anlegen und diesem eine / mehrere Rollen zuweisen.
Hier mein Code :
[CODE lang="java" title="USerController"]@Controller
public class UserController {
@GetMapping("/users/new")
public ModelAndView newUser() {
User user = new User();
ModelAndView mav = new ModelAndView("user_form");
mav.addObject("user", user);
Role role1 = new Role();
role1.setId(1);
role1.setName("ROLE 1");
Role role2 = new Role();
role2.setId(2);
role1.setName("ROLE 2");
Role role3 = new Role();
role3.setId(3);
role1.setName("ROLE 3");
List<Role> roles = Lists.newArrayList(role1, role2, role3);
mav.addObject("allRoles", roles);
return mav;
}
@PostMapping("/users/save")
public String saveUser(@ModelAttribute User user){
System.out.println("save user : " + user);
return "user_form";
}[/CODE]
[CODE lang="html" title="user form"]<body>
<form th:action="@{/users/save}" th
bject="${user}" method="post">
<p>
<label>Roles:
<input type="checkbox" name="roles"
th:each="role : ${allRoles}"
th:text="${role.name}"
th:value="${role.id}"
th:field="*{roles}"
/>
</label>
</p>
<input type="submit" id="submitButton" th:value="Save">
<input type="reset" id="resetButton" name="reset" th:value="Reset"/>
</form>
</body>[/CODE]
Wenn ich nun die Seite localhost:8080/users/new aufrufe erscheint das Eingabe Formular.
Wenn ich nun Speichere ruft er die Funktion saveUser im Controller auf. Allerdings erhalte ich dann folgende Exception :
Field error in object 'user' on field 'roles': rejected value [1]; codes [typeMismatch.user.roles,typeMismatch.roles,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.roles,roles]; arguments []; default message [roles]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'roles'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'entity.Role' for property 'roles[0]': no matching editors or conversion strategy found]]
Ich vermute mal, dass er aus dem String (Role ID) kein Role Object bauen kann ?!
Wenndas stimmt wie macht man es richtig ?
Ich habe mich an einem Beispiel hier orientiert.
Vielen Dank für eure Hilfe
Kurz zu dem was ich vorhabe :
Ich möchte gerne einen User anlegen und diesem eine / mehrere Rollen zuweisen.
Hier mein Code :
Java:
@Data
@ToString
public class User {
private Set<Role> roles = new HashSet<>();
}
Java:
@Data
@ToString
public class Role {
private Integer id;
private String name;
}
[CODE lang="java" title="USerController"]@Controller
public class UserController {
@GetMapping("/users/new")
public ModelAndView newUser() {
User user = new User();
ModelAndView mav = new ModelAndView("user_form");
mav.addObject("user", user);
Role role1 = new Role();
role1.setId(1);
role1.setName("ROLE 1");
Role role2 = new Role();
role2.setId(2);
role1.setName("ROLE 2");
Role role3 = new Role();
role3.setId(3);
role1.setName("ROLE 3");
List<Role> roles = Lists.newArrayList(role1, role2, role3);
mav.addObject("allRoles", roles);
return mav;
}
@PostMapping("/users/save")
public String saveUser(@ModelAttribute User user){
System.out.println("save user : " + user);
return "user_form";
}[/CODE]
[CODE lang="html" title="user form"]<body>
<form th:action="@{/users/save}" th
<p>
<label>Roles:
<input type="checkbox" name="roles"
th:each="role : ${allRoles}"
th:text="${role.name}"
th:value="${role.id}"
th:field="*{roles}"
/>
</label>
</p>
<input type="submit" id="submitButton" th:value="Save">
<input type="reset" id="resetButton" name="reset" th:value="Reset"/>
</form>
</body>[/CODE]
Wenn ich nun die Seite localhost:8080/users/new aufrufe erscheint das Eingabe Formular.
Wenn ich nun Speichere ruft er die Funktion saveUser im Controller auf. Allerdings erhalte ich dann folgende Exception :
Field error in object 'user' on field 'roles': rejected value [1]; codes [typeMismatch.user.roles,typeMismatch.roles,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.roles,roles]; arguments []; default message [roles]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'roles'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'entity.Role' for property 'roles[0]': no matching editors or conversion strategy found]]
Ich vermute mal, dass er aus dem String (Role ID) kein Role Object bauen kann ?!
Wenndas stimmt wie macht man es richtig ?
Ich habe mich an einem Beispiel hier orientiert.
Vielen Dank für eure Hilfe