【问题标题】:Is there an easy way to turn empty form inputs into null strings in Spring MVC?有没有一种简单的方法可以在 Spring MVC 中将空表单输入转换为空字符串?
【发布时间】:2011-02-27 23:46:58
【问题描述】:

我正在使用 Spring MVC 和 SimpleJdbcInsert 将对象插入 MySQL 数据库。我想在数据库中将空白输入设置为NULL,而不是''。我有很多字段,我希望有一种方法可以做到这一点,而无需手动检查每个值。

谢谢!


更新

所以我是个白痴。我的几个错误结合在一起使我相信下面的正确答案是不正确的。我写了一个 PropertyEditorSupport 像这样:

class StringEditor extends PropertyEditorSupport {

    public void setAsText(String text) {
        String value = text.trim();
        if ("" == value) {
            setValue(null);  
        } else {  
            setValue(value);  
        }
    }

}  


有两个问题:

  1. 没有 getAsText,所以我的表单填充了“null”字符串!
  2. 我的相等性检查是 C++,而不是 Java。当我尝试推荐的 setter,我刚刚重新加载了已经包含“null”的帖子 字符串。清理完所有这些后,一切都开始工作了。

感谢您的帮助,并为我的“操作员错误”道歉!

布雷特

【问题讨论】:

    标签: java spring spring-mvc form-submit


    【解决方案1】:

    将可选字段的默认值设置为 NULL - 实际上默认情况下它不是 NULL 吗?

    解析您的输入字符串,然后使用

    显式指定仅填充的列
     usingColumns
    

    哦,我建议您始终清理您的输入...

    【讨论】:

    • 介意告诉我如何将默认值设置为 NULL 吗?我得到了空字符串,所以我猜 NULL 不是默认值。
    • 我认为这是默认设置,但您也可以为每个字段添加显式 DEFAULT NULL 子句。 dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html NB - 注意我的罢工 - 我最初是在 SimpleJdbcInsert 类的上下文之外阅读的
    • 好的,我为数据库设置了默认的 NULL。我以为您指的是一种将 null 设置为表单上空输入的默认 java String 结果的方法! usingColumns (我认为)的问题在于它需要 (String ...) 作为参数 - 我需要对它们进行硬编码,而不是通过检查值在运行时动态创建字符串参数列表。我也可以让 getter 为空字符串返回 null,这似乎是可比的,但同样意味着检查每个值。
    【解决方案2】:

    也许你可以使用custom Binder

    【讨论】:

    • 我试过了,但它返回一个字符串。尝试 setValue(null) 给我留下了 Strings == "null" (四个字母的单词“null”,而不是值 null)。不是我想要的!
    • 不能返回nullString吗?
    • 自定义活页夹是对的。你在哪里看到这个Strings == "null";你在干嘛?您是否正在构建 SQL 字符串,如果是,请不要。使用 Preprable。
    • 这只适用于旧版本的 Spring 吗?我使用的是 2.5.5,但它不工作,即使使用 StringTrimmerEditor 也建议。我要绑定的对象正在获取一个值为“null”的字符串。我可以将对象传回一个新网页,我将得到文本“null”,所以这根本与 SQL 无关。所以我一直认为这只适用于旧版本的 Spring。还能是什么?
    【解决方案3】:

    你要找的课程是:

    org.springframework.beans.propertyeditors.StringTrimmerEditor
    

    如果你用true 构造它,它会将空/空白字符串转换为null。如何将其注册到活页夹取决于您是希望它成为默认视图还是仅适用于某些视图。

    例如,您可以在单个控制器上添加

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }
    

    instructions here

    【讨论】:

    • 关于 registerCustomEditor 在 Spring 2.5.5 中不起作用,请参阅我的 cmets 到 Bozho
    • 好吧,我不能在 2.5.5 上发誓,但我很确定在 2.5.6 和 3 上它将字符串设置为空引用,它不会设置带有“空”的值。也许如果您将违规代码添加到您的问题中,我们可以提供更多帮助?
    • 查看我对原始帖子的编辑。我的错,谢谢你的耐心。
    • 只是一个警告:@InitBinder只能配置@ModelAttribute注解参数的绑定。对于@RequestBody注解的参数是没用的。
    【解决方案4】:

    我知道这是旧的,但我浪费了大约 2 或 3 个小时,直到我找到了一种非常简单的方法来为我的所有控制器应用带有活页夹的 StringTrimmerEditor

    再一次:我必须记住 RTFM。

    在 spring 3.2 中,您可以创建一个 @ControllerAdvice-annottated 控制器类并使用 @InitBinder-annotated 方法,就像 @Affe 给出的示例一样。

    http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-initbinder-advice

    这是一个例子:

    @ControllerAdvice
    @Controller
    public class AppBindingInitializer {
    
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
        }
    
    }
    

    希望对某人有所帮助。

    【讨论】:

    • 为什么你需要@Controller@ControllerAdvice注解都在同一个bean上?
    • 对不起。现在不记得了,也无法在谷歌中轻松找到原因。 :)
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多