首页 > 解决方案 > 春季可以根据日期查找数据

问题描述

我正在尝试根据日期查找数据抛出异常

java.lang.IllegalArgumentException:空

@SuppressWarnings("deprecation")
    @GetMapping("/product-DateList/{pathDate}")
    public ModelAndView getFindByDateOfPurchase(@PathVariable("pathDate") String pathDate) {
        Date convertDate = new Date(pathDate);
        //Date Converted according to dataBase Format 
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String strDate = sdf.format(convertDate);
        Date date = null; 
        try {
            date =   DateFormat.getInstance().parse(strDate);
        } catch (ParseException pe) {
            pe.printStackTrace();
        }

        List<Product> dateofPurchaseList = grofersService.findByDateOfPurchase(date);

        Optional<List<Product>> optional = Optional.of(dateofPurchaseList);
        if (!optional.isPresent()) {
            logger.warn("Not Found Product");
            return new ModelAndView("notFound"); 
        }
        logger.info("Fetching Product according to Date");
        return new ModelAndView("productList", "dateofPurchaseList", dateofPurchaseList); 
    }

异常(打印堆栈跟踪)

java.lang.IllegalArgumentException: null
    at java.util.Date.parse(Unknown Source) ~[na:1.8.0_172]
    at java.util.Date.<init>(Unknown Source) ~[na:1.8.0_172]
    at com.javabootstar.controller.GrofersController.getFindByDateOfPurchase(GrofersController.java:66) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_172]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_172]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_172]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_172]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.18.RELEASE.jar:4.3.18.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.18.RELEASE.jar:4.3.18.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) ~[spring-webmvc-4.3.18.RELEASE.jar:4.3.18.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.18.RELEASE.jar:4.3.18.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.18.RELEASE.jar:4.3.18.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.18.RELEASE.jar:4.3.18.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.18.RELEASE.jar:4.3.18.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.31.jar:8.5.31]org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.31.jar:8.5.31]
        at java.lang.Thread.run(Unknown Source) [na:1.8.0_172]

在google中搜索这个问题没有找到这类问题,如何根据日期查找数据。

标签: javaspringdatespring-mvcspring-boot

解决方案


您发布的代码有几个问题,更重要的是这不会编译。

Date convertDate = new Date- 这显然是错误的。无论如何,忽略这一点还有几个问题:

您似乎传递了一个路径变量pathDate,我认为您需要使用该变量进行搜索。这从不在方法的主体中使用。相反,您(以错误的方式)创建了一个名为convertDate. 您继续将其转换为字符串,而没有明显的原因和用法。

然后,您继续创建一个名为的新变量date,您尝试使用该strDate变量对其进行初始化。所有这些行为根本上都是错误的。此外,您从 String 到 date 的转换也是错误的(因此您会收到 IllegalArgumentException)。

您不应该使用父类 ( DateFormat) 来执行日期转换,而是需要使用它的某些实现来执行转换(DateFormat是抽象的,直接实现是SimpleDateFormat)。

基于上述情况,您应该执行以下操作:

  • 从路径变量中获取日期。

  • 使用 SimpleDateFormat 转换为日期对象(或者您可以使用 Java 8 的 LocalDate API)

  • 然后将此日期传递给您的服务方法,该方法将从存储库中获取结果。

还有一些笔记。没有必要这样做:

Optional<List<Product>> optional = Optional.of(dateofPurchaseList);

假设您的服务方法返回一个产品列表或如果没有找到一个空列表,则后续dateofPurchaseList将永远不会为空。of使用静态创建器(假定非空)将其包装到可选中是错误的。您应该简单地调用List#isEmpty以检查返回的列表是否为空或包含任何值。


推荐阅读