mysql - spring JPA java.sql.Date 接受无效日期

标签 mysql json spring rest spring-boot

我正在为我的项目编写 REST API,以创建、检索和修改数据库中的值。 该模型有一个 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(日)。

此外,getTime() 的系统输出将打印出一些您可能不需要的额外信息。

我用这篇文章作为引用,它可能会给你一些额外的帮助:Detect invalid date on Calendar.set()

希望这对您有帮助。让我知道这是否需要调整

关于mysql - spring JPA java.sql.Date 接受无效日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927445/

相关文章:

mysql - 阻止字段更新的触发器不起作用,行为怪异

android - 使用 GSON fromJson 方法将 JSONArray 转换为对象

android - 图片未在下一个 Activity 中加载

php - 如何更改 phpMyAdmin 中的权限

mysql不重启

javascript - 无法使用 Wikipedia API 调用获取随机 JSON 对象属性

java - 如何在Spring中只允许用户修改自身的REST调用?

java - 如何在 Spring 中将 Multipart 文件作为字符串读取?

java - 我需要对基于 Spring 的 Rest Web 服务进行验证

mysql - 错误 1452 (23000) : Cannot add or update a child row: a foreign key constraint fails