@DateTimeFormat работает только с ограниченным шаблоном. Почему это происходит?

#java #spring #date-format

#java #весна #формат даты

Вопрос:

Я создаю форму, которая получает две даты регистрации, чтобы найти список пользователей, которые зарегистрировались между введенными датами.

Чтобы привязать входные данные из формы к данным типа LocalDateTime экземпляра команды, я использую @DateTimeFormat аннотацию в своем экземпляре команды, однако в этом коде работает только один шаблон.

Только yyyyMMddHH шаблон работает без исключения. Другие шаблоны, такие как yyyy-MM-dd , yyyy/MM/dd и другие, не работают.

Они генерируют исключение, подобное следующему

Не удалось преобразовать значение свойства типа java.lang.Строка требуемого типа java.time.LocalDateTime для свойства from; вложенным исключением является org.springframework.core.convert.ConversionFailedException: Не удалось преобразовать из типа [java.lang.Строка] для ввода [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] для значения 2020-08-13; вложенным исключением является java.lang.Исключение IllegalArgumentException: попытка синтаксического анализа значения не удалась [2020-08-13]

Это код для экземпляра команды,

 public class UserSearchByRegDateRequest {
    
    @DateTimeFormat(pattern = "yyyyMMddHH")
    private LocalDateTime from;
    @DateTimeFormat(pattern = "yyyyMMddHH")
    private LocalDateTime to;
    
    public LocalDateTime getFrom() {
        return from;
    }
    public void setFrom(LocalDateTime from) {
        this.from = from;
    }
    public LocalDateTime getTo() {
        return to;
    }
    public void setTo(LocalDateTime to) {
        this.to = to;
    }
}
  

Код для формы

 <body>

    <h2><spring:message code="regDateSearchFormTitle"/></h2>
    
    <spring:message code="dateFormatInstruction"/><br/><br/>
    
    <form:form action="processSearch" modelAttribute="searchCommand">
        
        <label> 
            <form:input path="from"/><spring:message code="from"/>
            <form:errors path="from"/>
        </label>
            
        <label>
            <form:input path="to"/><spring:message code="to"/>
            <form:errors path="to"/>
        </label>
            
        <input type="submit" value="search"/>
    </form:form>
    
    <c:if test="${!empty members}">
        <table>
            <tr>
                <th><spring:message code="search.id"/></th>
                <th><spring:message code="search.name"/></th>
                <th><spring:message code="search.email"/></th>
                <th><spring:message code="search.regDate"/></th>
            </tr>

        <c:forEach var="member" items="${members}">
            <tr>
                <td>${member.id}</td>
                <td>${member.name}</td>
                <td>${member.email}</td>
                <td><tf:formatDateTime value="${member.registerDateTime}" pattern="yyyy-MM-dd"/></td>
            </tr>
        </c:forEach>
        
        </table>
    </c:if>
</body>
  

Комментарии:

1. Для меня совершенно очевидно, что вы не можете назначить LocalDateTime from yyyy-MM-dd . На что бы вы хотели, чтобы он установил время суток? По умолчанию нет. Если вы не хотите или вам нужно время суток, используйте LocalDate вместо этого.

2. Большое вам спасибо!

Ответ №1:

Поскольку вы пытаетесь преобразовать только дату «2020-08-13» без указанного времени, вам следует использовать LocalDate с форматом как таковым:

 @DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate from;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate to;
  

Затем вы можете преобразовать строку с форматом «2020-08-13» в LocalDate без исключения.

Комментарии:

1. Спасибо! Я думаю, что я использовал LocalDateTime, не полностью понимая, что это такое.