#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
fromyyyy-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, не полностью понимая, что это такое.