【问题标题】:spring JPA java.sql.Date is accepting invalid Datesspring JPA java.sql.Date 接受无效日期
【发布时间】:2018-08-02 07:19:37
【问题描述】:

我正在为我的项目编写 rest api 来创建、检索和修改数据库中的值。 该模型有一个 sql.Date 字段,如果我给出日期例如 2018-01-35(yyyy-MM-dd),则在执行 POST 请求时,它会自动转换为 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

请帮我解决这个问题。

【问题讨论】:

    标签: mysql json spring rest spring-boot


    【解决方案1】:

    尝试使用 util.date 包获取日期。

    【讨论】:

    • 仅此而已,还是我应该做更多的事情?
    • 我试过 util.Date 就像你说的,但问题仍然存在
    • 我已经分享了与问题相关的所有内容。
    • 尝试删除@DateTimeFormat(pattern = "yyyy-MM-dd")。 java 将在内部处理格式。在检索数据后需要特定格式的地方使用 simpledateformat。
    • 很抱歉让您感到困惑,我的问题是当我尝试将数据插入 Mysql 时,它将“1993-01-35”转换为“1993-02-04”,所以我没有希望这发生。检索根本不是问题
    【解决方案2】:

    如果 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()

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

    【讨论】:

    • 感谢您的回复,我已经更新了我的问题,请检查
    • 我也在尝试解决同样的问题,但还没有运气。终于有解决办法了吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 2012-12-26
    • 2014-09-17
    • 2012-11-25
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多