我有一个带有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;
}
1条答案
按热度按时间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:
(忽略我之前的评论:这不是
System.lineSeparator()
控制我们看到的行为的设置是浏览器,因为它遵循处理表单数据的html规范)。