无法将 java.lang.String 类型的属性值转换为所需的 java.util.Date 类型

Posted

技术标签:

【中文标题】无法将 java.lang.String 类型的属性值转换为所需的 java.util.Date 类型【英文标题】:Failed to convert property value of type java.lang.String to required type java.util.Date 【发布时间】:2014-07-05 07:20:17 【问题描述】:

当我尝试在表单中输入日期时出现此错误。

任务控制器

@RequestMapping(value = "/docreatetask", method = RequestMethod.POST)
public String doCreateTask(Model model, @Valid Task task,
        BindingResult result, Principal principal,
        @RequestParam(value = "delete", required = false) String delete) 
    System.out.println(">TaskController doCreateTask " + task);

    if (result.hasErrors()) 
        System.out.println("/docreatetask in here");
        model.addAttribute("task", task);
        System.out.println("+++++"+task.getDeadline());// deadline is null  
        return "createtask";
    
        ...

创建.jsp

...
<form:form method="POST"
action="$pageContext.request.contextPath/docreatetask"
commandName="task">
<table class="formtable">
    <tr>
        <td class="label">Task</td>
        <td><form:input cssClass="control" path="taskname"
            name="taskname" type="text" /><br />
                <form:errors path="taskname" cssClass="error" /></td>
        </tr>
    <tr>
        <td class="label">Description</td>
        <td><form:textarea cssClass="control" path="description"
            name="description"></form:textarea><br />
                    <form:errors path="description" cssClass="error" /></td>
    </tr>
    <tr>
        <td class="label">Deadline (dd/mm/yyyy)</td>
        <td><form:input cssClass="control" path="deadline"
            name="deadline" type="date" /><br />
                <form:errors path="deadline" cssClass="error"></form:errors></td>
    </tr>
        ...

在控制器中,我写了以下相同的错误(以及不同的格式,如“yyyy/MM/dd”)

@InitBinder
public void initBinder(WebDataBinder webDataBinder) 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    dateFormat.setLenient(false);
    webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));

我也尝试在类中添加注释(以及不同的格式)但同样的错误

​    ...
    @Column(name = "deadline")
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private Date deadline;
   ...

【问题讨论】:

发布你的 JSP 代码。 我想,我发现了错误。我将 new SimpleDateFormat("dd/MM/yyyy") 更改为 new SimpleDateFormat("yyyy-MM-dd") 模式应该是"yyyy-MM-dd"。小心 MM(月)和 mm(分钟)。 是的,很抱歉拼写错误 【参考方案1】:

在控制器中添加这个。将 dateFormat 更改为您的区域设置首选项。

@InitBinder     
public void initBinder(WebDataBinder binder)
     binder.registerCustomEditor(       Date.class,     
                         new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true, 10));   

考虑在您的模型中使用此注释(根据您的喜好调整格式和 TemporalType)

@DateTimeFormat(pattern = "dd/MM/yyyy")
@Temporal(TemporalType.DATE)

【讨论】:

如果您需要将自己的 DateFormat 提供给 CustomDateEditor 绑定,这如何与 @DateTimeFormat 的模式参数相关联? @ DateTimeFormat 如果您再次将该字段转换为字符串,可能会有所帮助。例如。 (转换为 XML、Json 等)或仅在 JSP @Temporal 中获取属性将控制您是否将该字段存储为数据库中的 DATE 或 DATETIME 字段。 @borjab,非常感谢!我完全忘记了 initBinder……你为我节省了很多时间! 如何使用 InitBinder 为 OffsetDateTime.class 注册自定义编辑器?【参考方案2】:

只需将@DateTimeFormat(pattern = "yyyy-MM-dd") 与 (-) 相加

示例:

@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date dateNaissance;

【讨论】:

嗯,我认为这个答案是不必要的,因为这是从 2 年前开始的。 但它帮助了我 ;-) 这种情况下我该怎么办"2021-05-27 12:46:17"【参考方案3】:
@DateTimeFormat(pattern = "yyyy-MM-dd")

用这个替换你的格式。

【讨论】:

【参考方案4】:

你需要在 BaseController 中更改 initBinder

@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");   
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, null,  new CustomDateEditor(dateFormat, true));

【讨论】:

以上是关于无法将 java.lang.String 类型的属性值转换为所需的 java.util.Date 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;

无法将 java.lang.String 类型的对象转换为 com.example 类型

无法从类型 [java.lang.String] 转换为类型 [java.lang.Long]

无法将类型“java.lang.String”的属性值转换为属性“事务”所需的类型“java.util.List”

无法将类型“java.lang.String”的属性值转换为所需类型“java.util.Date”

无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型