весна JPA java.sql. Дата принимает недействительные даты

0

Я пишу 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

Пожалуйста, помогите мне решить эту проблему.

Теги:
spring-boot
spring
rest

2 ответа

0

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

  • 0
    Спасибо за ваш ответ, я обновил свой вопрос, пожалуйста, проверьте
0

Попробуйте использовать пакет util.date для даты.

  • 0
    только это или я должен сделать что-то большее?
  • 0
    Я пытался утилизировать. Дату, как вы сказали, но проблема все еще остается
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню