【问题标题】:How do I bind an empty string instead of a zero for an int field in Spring MVC?如何在 Spring MVC 中为 int 字段绑定空字符串而不是零?
【发布时间】:2020-12-06 22:53:54
【问题描述】:

我正在使用下面的代码将来自列表的内容绑定到视图。 这是人员对象的列表。这个人对象有一个数字字段(年份)。 有时数据库中年份字段的内容为零。 发生这种情况时,它将在表单的输入字段上绑定零。 相反,我想绑定一个空字符串。 也就是说,只需将该字段留空,而不是显示数字零。 我怎么做? 显然,当有实际年份时,它应该继续显示年份。

型号

@Entity
public class Person implements Serializable{

    private static final long serialVersionUID = 1L;

    private String name;

    private int year;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

}

DTO

public class PersonList {
    
    private List<Person> personList;

    public List<Person> getPersonList() {
        return personList;
    }

    public void setPersonList(List<Person> personList) {
        this.personList = personList;
    }

}

控制器

@RequestMapping(value = "/person", method = RequestMethod.POST)
public ModelAndView editPerson(@ModelAttribute PersonList personList)
{
    //perform operations

    //display results
    ModelAndView modelAndView = new ModelAndView("Person.html");
    modelAndView.addObject("personListBind", personList);
        
    return modelAndView;

}

查看

<form action="person" method="post" th:object="${personListBind}">
<th:block th:each="person, itemStat : *{personList}">

    Name:
    <input type="text" th:field="*{personList[__${itemStat.index}__].name}" />

    Year:   
    <input type="text" th:field="*{personList[__${itemStat.index}__].year}" />
</th:block>

【问题讨论】:

    标签: java spring-mvc thymeleaf


    【解决方案1】:

    一种方法是使用 派生值 方法,因此 UI 将字段视为字符串。

    模型

    @Entity
    public class Person implements Serializable {
    
        // all members from question are here, including getYear() and setYear()
    
        @Transient // Not a database column
        public String getYearStr() {
            return (year == 0 ? "" : Integer.toString(year));
        }
    
        public void setYearStr(String yearStr) {
            this.year = (yearStr.isEmpty() ? 0 : Integer.parseInt(yearStr));
        }
    
    }
    

    查看

        Year:
        <input type="text" th:field="*{personList[__${itemStat.index}__].yearStr}" />
    

    【讨论】:

    • 这非常有效。谢谢你。几个问题。 1) 应该使用哪个可用的瞬态?我选择了 org.springframework.data.annotation.Transient 并且效果很好。事实上,即使删除 Transient 它也运行良好并且没有创建 db 字段。那么为什么需要它呢? 2) 如果 yearStr 不存在,视图如何知道调用哪个字段?是的,视图中有 getYearStr 但没有 yearStr 。所以不确定映射是如何发生的。对于其他字段,有类似私有字符串名称的东西。然后视图使用“名称”。所以它匹配。
    • @jkfe 不,nameyear 不会通过这些名称访问 字段。一个名为getName()getter 方法意味着一个名为name属性。名为setName()setter 方法暗示该属性是可更新的。这就是为什么 getYearStr() 让 Thymeleaf 看到一个名为 yearStr 的属性。 字段private,Thymeleaf 看不到。
    • 我明白了。感谢您的解释。当然,私人的。忘了那个。瞬态呢?
    【解决方案2】:

    如果我理解正确,这些内容应该对你有用。

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <input type="text" th:if="${year eq 0}" value="No year">
    <input type="text" th:unless="${year eq 0}" th:value="${year}">
    
    </body>
    </html>
    

    【讨论】:

    • 如何使 POST 处理工作(参见控制器 editPerson 方法)
    • 看来我完全误解了他想要做什么。我认为您的解决方案看起来不错。
    • theChoosyBeggar 我试过这个,但无法显示空字段。但看起来很有希望。如果和除非在百里香中,想了解这一点。也许我做错了什么。你能澄清一下吗?我看到 Andreas 提到了 POST 的问题。想尝试做到这一点。也许做一个 requestparam 并在控制器上转换会起作用。
    • 使用这个百里香叶条件的想法,我可以让它在年份为零时正确显示为空白,并在有年份时显示年份。这是代码: 。问题是当我编辑字段并单击保存然后检查控制器中的值时,它仍然为零。猜猜这就是安德烈亚斯所说的 POST 问题。没办法解决?
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 2013-07-12
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2012-12-30
    • 2011-12-07
    • 2015-04-11
    相关资源
    最近更新 更多