Я пишу rest apis для своего проекта, чтобы создавать, извлекать и изменять значения в моей базе данных. Модель имеет поле sql.Date, которое при выполнении запроса POST, если я даю дату, например, 2018-01-35 (yyyy-MM-dd), автоматически преобразуется в 2018-02-04. Я хочу избежать этого, чтобы он мог сказать мне, что данная дата недействительна.
Я искал в SO и пробовал этот подход,
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date dob;
но это ничего не делало, поэтому я попробовал другой метод
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
но это проверяет только формат, например, если я даю значение просто "1993", он дает ошибку, но не проверяет "1993-01-35".
Я также пробовал,
public static boolean dateChecker(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setLenient(false);
calendar.setTime(date);
try{
calendar.getTime();
}catch(Exception e)
{
System.out.println(e.getMessage());
return false;
}
return true;
}
Но когда я его отлаживаю, этот метод уже получает "1993-01-35" как "1993-02-04".
Модель,
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
private Date dob;
Это мой метод POST,
@RequestMapping(value = "/patient",method = RequestMethod.POST,consumes = "application/json")
public ResponseEntity<?> createPatient(@RequestBody Patient patient)
{
if(patient.getPatientId()!=null)
{
Patient patient1 = patientRepository.findOne(patient.getPatientId());
if(patient1!=null)
{
return new ResponseEntity("Patient for the given patient Id already exists.",HttpStatus.BAD_REQUEST);
}
}
System.out.println(patient.getDob());//Here I am getting 1993-02-04 when i give date as 1993-01-35
Пожалуйста, помогите мне решить эту проблему.
Вы можете попробовать сделать что-то подобное, если calendar.setLenient не работает для вас.
Я просто добавил случайное число в течение дня для тестирования.
int day = 21;
Calendar gmtCal =
Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(Calendar.MONTH, Calendar.JANUARY);
if(day <= gmtCal.getActualMaximum(Calendar.DAY_OF_MONTH)){
gmtCal.set(1993, Calendar.JANUARY, day );
System.out.println(gmtCal.get(Calendar.YEAR));
System.out.println(gmtCal.get(Calendar.MONTH));
System.out.println(gmtCal.get(Calendar.DAY_OF_MONTH));
System.out.println(gmtCal.getTime());
}
else{
System.out.println("Out of bounds");
}
Первое, что вам нужно сделать, это установить месяц для календаря, а затем выполнить тест в тот день, который был введен. Если он пройдет, тогда вы можете установить всю дату и если не распечатать ошибку.
Примечание: при использовании Calendar.get год и день будут распечатаны правильно. Однако месяц начнется с нуля. Итак, в этом примере точка печатается: 1993 (год) 0 (месяц) 21 (день).
Кроме того, sysout для getTime() будет распечатывать дополнительную информацию, которая вам может не понадобиться.
Я использовал этот пост в качестве ссылки, он может дать вам дополнительную помощь. Обнаружить неверную дату в Calendar.set()
Я надеюсь, это поможет вам. Дайте мне знать, если это требует tweeking
Попробуйте использовать пакет util.date для даты.