【问题标题】:Spring Thymeleaf send object from select optionSpring Thymeleaf 从选择选项发送对象
【发布时间】:2018-04-11 09:38:36
【问题描述】:

我在添加用户方法中将具有输入字段值的对象发送到控制器时遇到问题。它会生成由选择框引起的错误(“错误请求”)。 表格连接效果很好,我可以打印用户列表并添加用户窗口,但添加用户不起作用。

代码:

实体类片段(还有带有休眠注释的 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

这就是它的外观。如您所见,权限列表已正确加载到选择框,当您填写其余字段时,它会在空白屏幕上显示“错误请求”错误。

百里香有可能做这样的事情吗? 我在等你的答案。

【问题讨论】:

  • 能否也包含您的表单标签?
  • ....
  • @Beast 然后在select 上使用th:field* 运算符
  • 它没有帮助..
  • 你确实检查了我在回答中链接的文档

标签: java spring hibernate thymeleaf


【解决方案1】:

您应该使用 tymeleaf backbean binding 来处理非原始 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>

这样,您将不构造 thymeleaf 将权限属性绑定到给定的选择字段(和选项)。注意th:objectth: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

【讨论】:

  • 但是你可以给我看一个你的控制器的片段吗?我认为在 post 方法中,你只采用 int/long 变量,我想采用具有权限的对象用户,但它没有加载它..
  • @Beast Bzzzz,你又想错了。我确切地知道你想要达到什么,这就是它应该做的。它适用于我的情况,应该适用于你的情况。 iv 添加了控制器方法签名以供您了解。如您所见,它接受我的域类Place 作为参数,BindingResultModel 是可选的。我在发布后得到的是完全初始化的Place 对象,带有Services CategoriesCity 的附加实体(所以这不是本示例中唯一有效的x对一关系。仔细看如果您没有误用 *$ 运算符,请打开。
  • 顺便说一句,明智的做法是查看浏览器发送的实际 POST 数据。所以检查一下,并将格式化的 POST 数据附加到您的问题中,这样我们将看到您实际发送的内容(请使用 EP URL 和标头)。它应该很容易帮助你。
【解决方案2】:

我只是这样做.. 我将对象的默认值设置为一个新实例,然后将选项的值设置为对象的 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;
 ...

百里香:

 <select th:field="${userEmes.permission.id}" >
     <option th:each="perm : ${perms}" th:value="${perm .id}" th:text="${perm.name}"></option>
 </select>

【讨论】:

    【解决方案3】:

    我做了所有事情,包括注册一个对象格式化程序。但只有上述解决方案(@Troll173)对我有用。我将 th:field 修改为 * 版本以保持表单标签内的一致性。

    <select th:field="*{permission.id}" >
         <option th:each="perm : ${perms}" th:value="${perm .id}" th:text="${perm.name}"></option>
     </select>
    

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2020-03-21
      • 2020-12-20
      • 2020-10-19
      • 2017-04-26
      • 1970-01-01
      • 2018-02-03
      • 2017-04-27
      • 1970-01-01
      相关资源
      最近更新 更多