Как преобразовать значение типа 'java .lang.String' в требуемый тип 'java .util.Date'? - PullRequest
0 голосов
/ 11 апреля 2020

Код моего рейса:

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;

и содержит методы получения и установки для этого:

и в моем репозитории полета (Интерфейс) У меня есть:

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 У меня есть следующий код:

<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"/>
    

и 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>

Но всякий раз, когда я нажимаю кнопку «Поиск», появляются ошибки:

The Error on webpage is as:

Если кому-то нужна более подробная информация, тогда я также могу укажите ссылку на github этого проекта.

Ответы [ 3 ]

0 голосов
/ 11 апреля 2020

Я могу прочитать на странице ошибок "для значения '2020-02-02' ....".

Вы правильно установили шаблон в POJO с аннотацией @DateTimeFormat (pattern = " дд-ММ-гггг "). Но по умолчанию JSP использует «гггг-ММ-дд». Здесь вы можете прочитать о том, что невозможно изменить формат.

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

Если вы используете аннотацию @Temporal, как сказал Каранджот, она автоматически отобразит java дату на sql дату. Но по умолчанию используется формат yyyy-MM-dd. Вам нужны как временные, так и форматные аннотации.

Проблема в том, что в вашем "front" вы используете "yyyy-MM-dd", а ваш метод findFlights ожидает "dd-MM-yyyy".

Я заметил, что вы вызываете хранилище напрямую из контроллера. Плохая практика Создайте сервис между контроллером и хранилищем. Ваш контроллер получит "гггг-ММ-дд". Преобразуйте его и отправьте в сервис в правильном формате.

И чтобы избежать слишком большого количества аргументов для метода findFlights (и другого), рассмотрите возможность использования объектов и DTO.

0 голосов
/ 11 апреля 2020

Мне нужно импортировать два класса, а именно Temporal и TemporalType в классе Model Flight. Вот полное решение.

import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Temporal(TemporalType.DATE)
private Date dateOfDeparture;
0 голосов
/ 11 апреля 2020

В параметре запроса вы получите строку, вам нужен форматер для преобразования ее в дату, вы можете использовать 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 

Или вы можете создать класс форматирования и использовать его.

После process

В hibernate есть временная аннотация для этого Вот пример

@Temporal(TemporalType.DATE)
private java.util.Date creationDate
...