0

我想以特定格式(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 似乎更喜欢 .toString() 方法而不是我的 initbinder 方法,而我的 getAsText() 方法永远不会被调用。

我的观点:

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

我发现 initbinder 的“方式”在代码可读性方面非常好。所以我想继续使用initbinder。是否可以告诉 thymeleaf 使用我的 initbinder 或任何其他好的解决方法?

4

1 回答 1

0

去掉参数“reservationtime”,可以解决问题:

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

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

于 2017-12-02T10:47:21.773 回答