Thymeleaf似乎更喜欢在initbinder customEditor上使用String

时间:2016-11-18 08:25:34

标签: java spring model-view-controller thymeleaf spring-mvc-initbinders

我想以特定格式(yyyy / MM / dd HH:mm)将LocalDateTime对象传递给thymeleaf,然后将其接收回我的控制器类。 我想使用customEditor / initbinder进行转换。

/**
 * Custom Initbinder makes LocalDateTime working with javascript
 */
@InitBinder
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
    binder.registerCustomEditor(LocalDateTime.class, "reservationtime", new LocalDateTimeEditor());
}

public class LocalDateTimeEditor extends PropertyEditorSupport {

    // Converts a String to a LocalDateTime (when submitting form)
    @Override
    public void setAsText(String text) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
        LocalDateTime localDateTime = LocalDateTime.parse(text, formatter);
        this.setValue(localDateTime);
    }

    // Converts a LocalDateTime to a String (when displaying form)
    @Override
    public String getAsText() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
        String time = ((LocalDateTime)getValue()).format(formatter);
        return time;
    }

}

虽然spring在从表单接收数据时使用了我的initbinder,但是thymeleaf似乎更喜欢我的initbinder上的.toString()方法而且我的getAsText()方法永远不会被调用。

我的观点:

<input type="text" th:name="${reservationtime}" id="reservationtime" class="form-control"
                                       th:value="${reservationtime}"/>

我找到了启动器&#34;方式&#34;在代码可读性方面相当不错。所以我想继续使用initbinder。有可能告诉百里香使用我的启动器或任何其他好的解决方法吗?

1 个答案:

答案 0 :(得分:0)

删除参数“reservationtime”,可以解决问题:

binder.registerCustomEditor(LocalDateTime.class, new LocalDateTimeEditor());

然后,转换器将用于所有LocalDateTime字段