Java TextArea换行导致错误:值太长,无法更改类型字符(1000)
我有一个带有textarea标记的html页面 textarea(和相应的postgres db字段)接受1000个字符 如果我创建的文本是一个包含1000个字符(包括单词之间的空格)的单个段落,并单击“保存”,它将正确保存到数据库中 但如果用换行符替换一个字符,则单击“保存”时会出现以下错误:Java TextArea换行导致错误:值太长,无法更改类型字符(1000),java,html,spring,spring-mvc,thymeleaf,Java,Html,Spring,Spring Mvc,Thymeleaf,我有一个带有textarea标记的html页面 textarea(和相应的postgres db字段)接受1000个字符 如果我创建的文本是一个包含1000个字符(包括单词之间的空格)的单个段落,并单击“保存”,它将正确保存到数据库中 但如果用换行符替换一个字符,则单击“保存”时会出现以下错误: org.postgresql.util.psqleexception:错误:值太长,无法更改类型字符(1000) 错误发生在进入控制器方法之前 为什么会这样 问题不在于接受换行符 这是因为如果字符总数远
org.postgresql.util.psqleexception:错误:值太长,无法更改类型字符(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" />
控制器
@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;
}
当用户在HTML
中键入数据时,Enter键会导致以单个U+000A换行符的形式添加换行符(请参阅)
如果尝试将Windows样式的CR-LF换行符粘贴到文本区域中,它将标准化为单个LF字符
但是,当在表单提交期间处理相同的数据时,
中的数据被“规范化”(与上述参考相同):
它是标准化的,因此换行符使用U+000D回车U+000A换行符(CRLF)字符对
因此,浏览器通常执行用CR-LF对替换单个LF的过程
如果这导致Java字符串对于要保存它的数据库字段太长,则可以将字符串中的每个CR-LF对转换为LFs:
String text=text.replace(“\r\n”,“\n”);
(忽略我前面的评论:控制我们看到的行为的不是System.lineSeparator()
设置,而是浏览器,因为它遵循HTML规范处理表单数据)。。每一次换行都会增加文本的长度,增加一个或多个字符。这很有意义。问题是如何防止应用程序在这种情况下抛出错误?当用户插入换行符时,textarea maxlength属性验证在textarea中似乎无法正常工作。我无法复制该问题。使用您问题中的文本区域,如果我输入999个字符的可见文本,那么我可以输入1个换行符(任意位置)-然后我不能输入更多数据-可见字符、空格、换行符、制表符等。对,您不能输入更多数据。那很好。但是,当您单击save时,它将抛出我提到的错误,并且永远不会进入controller方法。如果不添加换行符,它将进入控制器方法并正常保存到db。好的-这是我的错误-我误解了问题。回答得好。很棒的解决方案。答案被接受。再次感谢。
@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;
}