![](/img/trans.png)
[英]Failed to convert property value of type java.lang.String to required type java.util.Date
[英]How to convert value of type 'java.lang.String' to required type 'java.util.Date'?
我的航班代码:
import java.sql.Timestamp;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.springframework.format.annotation.DateTimeFormat;
@Entity
@Table(name = "FLIGHT")
public class Flight
{
@Column(name = "flight_number")
private String flightNumber;
@Column(name = "operating_airlines")
private String operatingAirlines;
@Column(name = "arrival_city")
private String arrivalCity;
@Column(name = "departure_city")
private String departureCity;
@Column(name = "date_of_departure")
@DateTimeFormat(pattern = "dd-MM-yyyy")
private Date dateOfDeparture;
@Column(name = "estimated_departure_time")
private Timestamp estimatedDepartureTime;
并为此包含 getter 和 setter:
在我的飞行存储库(接口)中,我有:
package com.nischal.flightreservation.repos;
import java.util.Date;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.nischal.flightreservation.entities.Flight;
public interface FlightRepository extends JpaRepository<Flight, Integer> {
@Query(value = "select * from FLIGHT where departure_city=:departureCity and
arrival_city=:arrivalCity and date_of_departure=:dateOfDeparture", nativeQuery = true)
List<Flight> findFlights(@Param("departureCity") String from, @Param("arrivalCity") String
to, @Param("dateOfDeparture") Date departureDate);
}
并且它们与数据库表正确映射。
在我的 FlightControllers 中,我有:
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.nischal.flightreservation.entities.Flight;
import com.nischal.flightreservation.repos.FlightRepository;
@Controller
public class FlightController {
@Autowired
private FlightRepository flightRepository;
@RequestMapping("/findFlights")
public String findFlights(@RequestParam(required = false,name = "from") String from,
@RequestParam(required = false,name = "to") String to,@RequestParam(required = false, name =
"departureDate") @DateTimeFormat(pattern = "dd-MM-yyyy") Date departureDate ,ModelMap
modelMap)
{
List<Flight> flights = flightRepository.findFlights(from, to, departureDate);
modelMap.addAttribute("flights",flights);
return "displayFlights";
}
}
在我的 findFlights.jsp 我有以下代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Search the Flights</title>
</head>
<body>
<form action = "findFlights" method = "post">
<pre>
From: <input type = "text" name = "from"/>
To : <input type = "text" name = "to"/>
Departure Date:<input type = "date" name = "departureDate"/>
<input type = "submit" value = "Search"/>
</pre>
</form>
displayFlights 负责根据搜索显示可用的航班,代码为:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Available Flights</title>
</head>
<body>
<h2>Flights</h2>
<table>
<tr>
<th>Airlines</th>
<th>Departure City</th>
<th>Arrival City</th>
<th>Departure Time</th>
</tr>
<c:forEach items = "${flights}" var = "flight">
<tr>
<td>flight.operatingAirlines</td>
<td>flight.departureCity</td>
<td>flight.arrivalCity</td>
<td>flight.estimatedDepartureTime</td>
<td><a href = "showCompleteReservation?flightId=${flight.id }">Select</a>
</tr>
</c:forEach>
</table>
但是每当我点击搜索按钮时,它都会产生错误消息:
如果有人想要更多细节,那么我也可以提供这个项目的 github 链接。
在请求参数中,您将获得字符串,您需要一个格式化程序将其转换为日期,您可以使用 DateTimeFormatter
@PostMapping("/date")
public void date(@RequestParam("date")
@DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
// ...You need to map your java date to SQL date
或者您可以创建一个格式化程序 class 并使用它。
处理后
在 hibernate 中有时间注释来做这里是一个示例
@Temporal(TemporalType.DATE)
private java.util.Date creationDate
我可以在错误页面中读取“值'2020-02-02'....”。
您已使用注释 @DateTimeFormat(pattern = "dd-MM-yyyy") 在 POJO 中正确设置了模式。 但是,默认情况下,JSP 使用“yyyy-MM-dd”。 在这里您可以阅读有关无法更改格式的信息。
我认为 html 中的输入格式将取决于本地语言浏览器配置。
如果您使用 @Temporal 注释,就像 Karanjot 说的那样,它将 map 自动将 java 日期转换为 sql 日期。 但默认格式仍然是 yyyy-MM-dd。 您需要两者:时间和格式注释。
问题是,在您的“前面”,您使用的是“yyyy-MM-dd”,而您的 findFlights 方法需要“dd-MM-yyyy”。
我观察到您直接从 controller 调用存储库。 不好的做法。 在 controller 和存储库之间创建一个服务。 您的 controller 将收到“yyyy-MM-dd”。 将其转换并以正确的格式发送到服务。
为了避免太多 arguments 到 findFlights 方法(和另一个),考虑使用对象和 DTO。
我必须在 Model class Flight 中导入两个类,即 Temporal 和 TemporalType。 在这里,是完整的解决方案。
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Temporal(TemporalType.DATE)
private Date dateOfDeparture;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.