textarea换行导致错误:值太长,无法更改类型字符(1000)

g52tjvyc  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(281)

我有一个带有textarea标签的html页面。
textarea(和相应的postgres db字段)接受1000个字符。
如果我创建一个包含1000个字符(包括单词之间的空格)的单个段落的文本并单击save,它会正确地保存到db中。
但如果用换行符替换一个字符,则单击“保存”时会出现以下错误: org.postgresql.util.PSQLException: ERROR: value too long for type character varying(1000) 错误发生在进入控制器方法之前。
为什么会这样?
问题不在于接受换行符。
这是因为如果字符总数远远小于限制(比如总共900个字符),我可以插入几行分隔符,这样就可以很好地保存。
因此,我无法理解为什么在接近字符限制时接受换行符会发生错误。
这是密码。

<textarea type="text" name="description" maxlength="1000" th:text="${descBind.description}" cols="55" rows="16"></textarea>
</br> <input type="submit" name="btnSave" value="Save" />

模型

@Entity
public class Desc implements Serializable {

    private static final long serialVersionUID = 1L;    

    @Column(length = 1000)
    private String description;

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }   
}

控制器

@RequestMapping(value = "descriptionpage", params = "btnSave", method = RequestMethod.POST)
public ModelAndView save(@ModelAttribute Desc desc, RedirectAttributes attributes) {

    //code to update the db

    ModelAndView modelAndView = new ModelAndView("descriptionpage.html");
    modelAndView.addObject("descBind", desc);

    return modelAndView;
}
lvjbypge

lvjbypge1#

当用户在html中键入数据时 <textarea> ,回车键使换行符以单个字符的形式添加 U+000A LINE FEED (lf)字符(见参考文献)。
如果您尝试将windows样式的cr lf换行符粘贴到文本区域中,它将标准化为单个lf字符。
但是,在表单提交过程中处理相同的数据时 <textarea> 是否“标准化”(与上述参考相同):
它是标准化的,因此换行符使用u+000d回车u+000a换行符(crlf)字符对
因此,浏览器通常会执行用cr lf对替换单个lf的过程。
如果这导致java字符串对于要保存它的数据库字段太长,可以将字符串中的每个cr lf对转换为lfs:

String text = text.replace("\r\n", "\n");

(忽略我之前的评论:这不是 System.lineSeparator() 控制我们看到的行为的设置是浏览器,因为它遵循处理表单数据的html规范)。

相关问题