Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 使用Spring将空字符串转换为空日期对象_Java_Spring_Spring Mvc - Fatal编程技术网

Java 使用Spring将空字符串转换为空日期对象

Java 使用Spring将空字符串转换为空日期对象,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有一个表单字段,应该转换为日期对象,如下所示: <form:input path="date" /> 有没有一种简单的方法可以指示空字符串应该转换为null?或者我应该写我自己的属性编辑器 谢谢 Spring提供了一个名为的PropertyEditor,您可以将其配置为将空字符串转换为空值。您通常必须在控制器的@InitBinder方法中注册它: @InitBinder public void initBinder(WebDataBinder binder) { Simp

我有一个表单字段,应该转换为日期对象,如下所示:

<form:input path="date" />
有没有一种简单的方法可以指示空字符串应该转换为null?或者我应该写我自己的属性编辑器


谢谢

Spring提供了一个名为的PropertyEditor,您可以将其配置为将空字符串转换为空值。您通常必须在控制器的
@InitBinder
方法中注册它:

@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setLenient(false);

    // true passed to CustomDateEditor constructor means convert empty String to null
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}

较新版本的Spring框架引入了转换和格式化服务来处理这些任务,以某种方式将属性编辑器系统抛在了后面。但是,不幸的是,报告的问题仍然存在:默认的
DateFormatter
将空字符串转换为
null
Date
对象。我发现非常令人恼火的是,Spring文档提供了两种转换(到字符串和从字符串转换)。框架实现和框架文档之间的这种差异真的让我发疯,以至于我甚至可以在找到时间投入到这项任务时提交补丁

同时,我建议在使用Spring框架的现代版本时遇到此问题的每个人将默认的
DateFormatter
子类化,并覆盖其
parse
方法(如果需要,也可以覆盖其
print
方法)以便以文档中所示的方式添加一个保护子句

package com.example.util;

import java.text.ParseException;
import java.util.Date;
import java.util.Locale;

public class DateFormatter extends org.springframework.format.datetime.DateFormatter {

    @Override
    public Date parse(String text, Locale locale) throws ParseException {
        if (text != null && text.isEmpty()) {
            return null;
        }
        return super.parse(text, locale);
    }

}
然后,必须对XMLSpring配置进行一些修改:必须定义转换服务bean,并且必须正确设置
mvc
命名空间中
annotation-driven
元素中的相应属性

<mvc:annotation-driven conversion-service="conversionService" />
<beans:bean
    id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <beans:property name="formatters">
        <beans:set>
            <beans:bean class="com.example.util.DateFormatter" />
        </beans:set>
    </beans:property>
</beans:bean>
<beans:bean class="com.example.util.DateFormatter">
    <beans:property name="pattern" value="yyyy-MM-dd" />
</beans:bean>

使用Spring 5时,此错误仍然可能会非常错误地发生。。。。如果您有一个映射的集合,例如这样的集合,请确保您的索引在集合中是正确的(这来自Spring控制器中的@initBinder)

if(sm!=null&&sm.getsapsaleems()!=null){
int i=sm.getsapsaleems().size();
对于(int x=0;x
“i”应为x))),创建了迄今为止无法强制转换空字符串的相同错误:

默认消息[salesOrderItems[1].pickDate];默认消息[未能将类型为“java.lang.String”的属性值转换为属性“salesOrderItems[1].pickDate”所需的类型“java.util.Date”;嵌套异常为org.springframework.core.convert.ConversionFailedException:未能将类型[java.lang.String]转换为类型值“”的[java.util.Date];嵌套异常为java.lang.IllegalArgumentException]

jsp代码如下所示:

<td><form:input cssClass="datepicker" size="10"
                                    path="salesOrderItems[${loopStatus.index}].pickDate" /></td>


…还有另一个原因,即相同的配置,您可能会遇到相同的误导性错误,即如果sap行的嵌套集合(请参见我的示例)在表单支持对象中不可用…

如果您没有注册自定义PropertyEditor,它如何处理非空字符串?因为Spring有许多内置的PropertyEditor,如:也表示默认情况下未注册CustomDateEditor,但似乎确实如此!非常有用,谢谢。如果我使用Java样式Spring配置而非XML您知道如何实现这一点吗?@Luke不幸的是,我不知道。我还没有在Spring项目中使用基于Java的配置。好的,谢谢,似乎Spring MVC和Spring Webflow配置的大部分内容都是XML风格的(甚至文档):)
if(sm != null && sm.getSapSaleItems() != null) {
        int i = sm.getSapSaleItems().size();
        for (int x = 0; x < i ; x++) {
            binder.registerCustomEditor(Date.class, "salesOrderItems[" + i + "].pickDate",
                    new CustomDateEditor(dateFormatter, true));
            
        }
<td><form:input cssClass="datepicker" size="10"
                                    path="salesOrderItems[${loopStatus.index}].pickDate" /></td>