无法转换类型' java.lang.String'的属性值要求的类型' java.time.LocalDate'对于财产'日期'以百里香的形式

时间:2018-06-07 18:07:51

标签: spring kotlin thymeleaf java-time

        var timeoutPromise;
        showTooltipFn = function() {
          timeoutPromise = $timeout(function() {
            tt.tooltip("show");
          }, commonOptions.delay.show);
          tt.on("mouseleave", function() {
            $timeout.cancel(timeoutPromise);
          });
        };
      }

上述表单的控制器

<form th:action="@{/hi}"  th:object="${datum}" method="post">
    <p>date : <input type="date" th:field="*{date}"/> </p>
    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>

简单的pojo类

@PostMapping("/hi")
fun testum(@ModelAttribute datum: Datum) {
    println(datum)
}

我正在尝试以表格形式发送日期,但获得此例外:

class Datum(
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        var date: LocalDate? = null
)

但是如果我将类型从LocalDate更改为String,它可以正常工作。我想将表格中的日期映射到Datum类的日期属性。任何人都可以帮助我吗?任何链接?感谢。

这个链接对我没有帮助similar problem

2 个答案:

答案 0 :(得分:1)

我刚用控制器创建了你的例子:

@Controller
public class StackOverflow {

@GetMapping("/stack")
public String template(Model m) {
    m.addAttribute("datum", new Datanum());
    return "stackoverflow.html";
}

@PostMapping("/stack2")
public String testum(@ModelAttribute Datanum user) {
    System.out.println(user.getDate());
    return null;
}
}

这是视图:

<!DOCTYPE html>
<html xmlns:th="http://www.thymleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<form th:action="@{/stack2}"  th:object="${datum}" method="post">
            <p>date : <input type="date" th:field="*{date}"/> </p>
            <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
        </form>
</body>
</html>

这就是Bean

   import java.time.LocalDate;

   import org.springframework.format.annotation.DateTimeFormat;

   public class Datanum{
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private LocalDate date;

        public LocalDate getDate() {
            return date;
        }

        public void setDate(LocalDate date) {
            this.date = date;
        }
    }

它起作用了:

enter image description here

enter image description here

我看到的不同之处在于您在Bean上使用var

  var date: LocalDate? = null

我认为这是Java 10,不是吗?为什么不尝试使用

像我一样做豆子,也许这可以帮助你。

而不是var使用LocalDate

希望这有效

答案 1 :(得分:0)

这是一个古老的问题,但我只留给未来的读者一个答案。
这不是百里香的问题,更不是@DateTimeFormat绑定的问题。
如果像这样更改Datum类,上述问题中的示例将起作用:

解决方案1。

class Datum {
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    var date: LocalDate? = null
}

请注意,date字段已从在主要构造函数中的声明移至类主体中。
(请注意,从Datum (...)更改为Datum {...}

解决方案2。

class Datum (
   @field:DateTimeFormat(pattern = "yyyy-MM-dd") var date: LocalDate? = null
)

如果由于将其作为data class或其他原因而需要在构造函数中声明它,则必须使用use-site targets进行注释。
但是,请注意解决方案2可能并不总是有效。我无法在一个示例项目中进行复制-但是在一个实际项目中,存在一个问题,其中@field:DateTimeFormat不能正确地将请求参数字符串绑定到Date对象。它有时行之有效,有时却行不通,因此调试起来非常棘手。
当它不起作用时,它会发出诸如Validation failed for object='Datum'. Error count: 1之类的错误,而恢复到解决方案1总是可以。每次我们再次编译时,解决方案2有时都会工作,并且会随机中断,而无需进行任何代码更改。
我们已采取严格将@DateTimeFormat带注释的字段放入类主体声明的方式,以确保其有效。