我在使用add user方法向输入字段发送带有值的对象时遇到问题。它会生成由选择框引起的错误(“错误请求”)。 表连接效果很好,我可以打印用户列表并添加用户窗口,但添加用户不起作用。
代码:
实体类片段(还有带有hibernate注释的getter和setter)
@Entity
@Table(name = "user_emes")
public class UserEmes implements java.io.Serializable {
private long idUser;
private String code;
private String name;
private String surname;
private Permission permission; -> object from another Table called "permissions"
private String login;
private String password;
private boolean isActive;
...
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_permissions")
public Permission getPermission() {
return permission;
}
控制器
@RequestMapping(value = "/addUser", method = RequestMethod.GET)
public String userForm(Model model) {
model.addAttribute("user", new UserEmes());
return "index";
}
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public ModelAndView addUser(@ModelAttribute("user") UserEmes userEmes) {
emesUserService.addUser(userEmes);
return new ModelAndView("redirect:/all-users");
}
Html(选择框):
<div class="form-group input-group has-feedback">
<span class="input-group-addon"> <label>UPRAWNIENIA</label>
</span>
<div
th:if="${permissionsList != null and not #lists.isEmpty(permissionsList)}">
<select class="form-control" name="permission">
<option th:each="dropDownItem : ${permissionsList}"
th:value="${dropDownItem.getIdPermission()}"
th:text="${dropDownItem.toString()}" />
</select>
</div>
一些截图: List of users Add user
这就是它的样子。正如您所看到的,权限列表已正确加载到选择框,当您填写其余字段时,它会在空白屏幕上显示“错误请求”错误。
百里香有可能做这样的事吗? 我在等你的答案。
答案 0 :(得分:1)
你应该使用tymeleaf backbean绑定而不是原始的ids
<select th:object="${user}" th:field="*{permission} class="form-control" name="permission">
<option th:each="dropDownItem : ${permissionsList}"
th:value="${dropDownItem.getIdPermission()}"
th:text="${dropDownItem.toString()}" />
</select>
通过这种方式,您将使用百万富翁将权限属性绑定到给定的选择字段(和选项)。请注意th:object
,th:field
和*
运算符,这不是拼写错误,此处应使用明星$
。
检查Spring-Thymeleaf集成的文档,在那里进行描述
http://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html并检查如何创建select
输入。
PS:以下是我的一个项目中select
字段的示例
<div class="form-group" th:classappend="${#fields.hasErrors('city') ? 'has-error' : _}">
<label class="control-label" for="place-city">City</label>
<select class="form-control" id="place-city" th:field="*{city}">
<option value="" selected>----SELECT CITY----</option>
<option th:each="city : ${allCities}" th:value="${city.id}" th:text="${city.name}"></option>
</select>
<span class="help-block" th:each="msg : ${#fields.errors('addressLine')}" th:text="${msg}">Some error message for this field</span>
</div>
控制器端:
@PostMapping(value = "/add")
@Transactional
public String addPlacePost(@Valid final Place place, BindingResult placeValidation, Model model) {
根实体Place
,其属性为private City city
。
答案 1 :(得分:0)
我就是这样做的.. 我将对象的默认值设置为新实例,然后将选项的值设置为对象的id。但当然,根据您的使用情况,您可能必须使用该ID来查找对象。
控制器:
@Entity
@Table(name = "user_emes")
public class UserEmes implements java.io.Serializable {
private long idUser;
private String code;
private String name;
private String surname;
private Permission permission = new Permission();
private String login;
private String password;
private boolean isActive;
...
Thymeleaf:
<select th:field="${userEmes.permission.id}" >
<option th:each="perm : ${perms}" th:value="${perm .id}" th:text="${perm.name}"></option>
</select>
答案 2 :(得分:0)
我做了所有事情,包括注册对象格式化程序。但是只有上述解决方案(@ Troll173)对我有用。我将th:field修改为*版本,以保持表单标签内的一致性。
<select th:field="*{permission.id}" >
<option th:each="perm : ${perms}" th:value="${perm .id}" th:text="${perm.name}"></option>
</select>