Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TextArea换行导致错误:值太长,无法更改类型字符(1000)_Java_Html_Spring_Spring Mvc_Thymeleaf - Fatal编程技术网

Java TextArea换行导致错误:值太长,无法更改类型字符(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) 错误发生在进入控制器方法之前 为什么会这样 问题不在于接受换行符 这是因为如果字符总数远

我有一个带有textarea标记的html页面

textarea(和相应的postgres db字段)接受1000个字符

如果我创建的文本是一个包含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;
}