英文:
How to convert value of type 'java.lang.String' to required type 'java.util.Date'?
问题
My Flight Code:
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;
// Contains getters and setters for these properties
}
In my Flight Repository (Interface):
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);
}
In my Flight Controllers:
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";
}
}
In my 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>
</body>
</html>
The displayFlights.jsp to display available flights:
<!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></td>
</tr>
</c:forEach>
</table>
</body>
</html>
If anyone wants more details, I can also provide the GitHub link to this project.
英文:
My Flight Code:
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;
and contains getters and setters for this:
and In my Flight Repository(Interface) I have:
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);
}
and they are correctly mapped with the database tables.
and in my FlightControllers I have:
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";
}
}
In my findFlights.jsp I have following code:
<%@ 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>
</body>
</html>
and displayFlights is responsible to display the available flights based on the search and the code is :
<!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>
</body>
</html>
But whenever i hit Search button it yields errors saying:
If anyone wants more detail then i can also provide the github link of this project.
答案1
得分: 0
请求参数中,您会获得一个字符串,您需要一个格式化程序将其转换为日期,您可以使用DateTimeFormatter。
@PostMapping("/date")
public void date(@RequestParam("date")
@DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
// ...您需要将您的Java日期映射到SQL日期
或者您可以创建一个格式化程序类并使用它。
处理之后,
在Hibernate中,有一个temporal注解可以实现这一点。
这里是一个示例
@Temporal(TemporalType.DATE)
private java.util.Date creationDate;
英文:
In request parameter you will get string you need a formatter to convert it to date you can use 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
Or you can create a formatter class and use it.
After process
In hibernate there is temporal annotation to do it
Here is a sample
@Temporal(TemporalType.DATE)
private java.util.Date creationDate
答案2
得分: 0
我能在错误页面中看到“对于值'2020-02-02'...”。
您已经在POJO中使用了@DateTimeFormat(pattern = "dd-MM-yyyy")注解正确设置了模式。但是,默认情况下,JSP正在使用"yyyy-MM-dd"。您可以在这里阅读关于无法更改格式的内容。
我认为html中的输入格式取决于本地语言浏览器配置。
如果您使用@Temporal注解,就像Karanjot说的那样,它会自动将Java日期映射到SQL日期。但默认格式仍然是yyyy-MM-dd。您需要同时使用temporal和format注解。
问题是在您的“前端”中,您正在使用"yyyy-MM-dd",而您的findFlights方法期望"dd-MM-yyyy"。
我已经观察到您正在从控制器直接调用存储库。这是不良做法。在控制器和存储库之间创建一个服务。您的控制器将接收"yyyy-MM-dd"。将其转换并以正确的格式发送到服务。
为了避免向findFlights方法(以及其他方法)传递过多的参数,考虑使用对象和DTOs。
英文:
I can read in the error page "for value '2020-02-02'....".
You have set correctly the pattern in the POJO with the annotation @DateTimeFormat(pattern = "dd-MM-yyyy"). But, by default, JSP are using "yyyy-MM-dd". Here you can read about that is impossible to change the format.
I think that the input format in html will depends on local language browser configuration.
If you use the @Temporal annotation, like Karanjot said, it will map automatically java date to sql date. But the default format still being yyyy-MM-dd. You need both: temporal and format annotations.
The problem is that, in your "front", you are using "yyyy-MM-dd" and your findFlights method expect "dd-MM-yyyy".
I have observe that you are calling the repository directly from controller. Bad practice. Create a service between controller and repository. Your controller will receive "yyyy-MM-dd". Convert it and send to service with correct format.
And to avoid too much arguments to findFlights method (and another), consider to use objects and DTOs.
答案3
得分: 0
我必须在Model类Flight中导入两个类,分别是Temporal和TemporalType。
以下是完整的解决方案。
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Temporal(TemporalType.DATE)
private Date dateOfDeparture;
英文:
I have to import two Classes namely Temporal and TemporalType in Model class Flight.
Here, is the complete solution.
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Temporal(TemporalType.DATE)
private Date dateOfDeparture;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论