【问题标题】:Spring @RequestParam DateTime format as ISO 8601 Date Optional TimeSpring @RequestParam DateTime 格式为 ISO 8601 日期可选时间
【发布时间】:2016-08-11 03:11:11
【问题描述】:

我将 Spring Framework 用于我的服务 API,org.joda.time.DateTime 用于日期时间解析。具体来说,我使用的是ISOFormatter.dateOptionalTimeParser(),它允许用户灵活地只使用日期,或者同时使用日期和时间,这是一个要求。

相信我,我已经看到了所有这些相关的问题,我已经可以告诉人们将指向我的问题,例如thisthis

之前我是把日期取为String,然后在服务层使用上面提到的joda formatter进行处理,但是现在我想在控制器中添加请求验证,这意味着如果请求语法不正确,请求甚至不应该转到服务层。

我尝试过使用@DateTimeFormat(iso = ISO.DATE_TIME) 的多种变体,以及以格式指定pattern 字符串,但无论如何都没有成功。

@RequestMapping(value = URIConstants.TEST_URL, method = RequestMethod.GET)
public @ResponseBody String getData(@RequestParam(required = false) DateTime from,
                                    @RequestParam(required = false)  DateTime to)  {
    return dataService.fetchDataFromDB(from, to);
}

我应该怎么做才能确保我从用户那里得到的日期符合ISO 8601 dateOptionalTime 格式?我可以应用多种模式来实现吗?

【问题讨论】:

    标签: java spring-mvc jodatime


    【解决方案1】:

    我最终为此创建了一个 POJO,我使用 ISODateTimeFormat.dateOptionalTimeParser() 解析来自 String 的时间:

    public class DateOptionalTime {
    
        private DateTime date;
    
        private DateTimeFormatter formatter = ISODateTimeFormat.dateOptionalTimeParser();
    
        public DateOptionalTime() {
        }
    
        public DateOptionalTime(String date) {
            if (date != null) {
                this.setDate(formatter.parseDateTime(date));
            }
        }
    
        public DateTime getDate() {
            return date;
        }
    
        public void setDate(DateTime date) {
            this.date = date;
        }
    
        public LocalDateTime getLocalDateTime() {
            return date.toLocalDateTime();
        }
    
    
    }
    

    在控制器中,我是这样使用的:

    @RequestMapping(value = URIConstants.TEST_URL, method = RequestMethod.GET)
    public @ResponseBody String getData(@RequestParam(required = false) DateOptionalTime from,
                                        @RequestParam(required = false)  DateOptionalTime to)  {
        return dataService.fetchDataFromDB(from, to);
    }
    

    它根据 ISO 标准验证日期格式,如果格式不正确,则返回 BAD_REQUEST 状态。

    【讨论】:

      【解决方案2】:

      您还可以创建一个转换器来处理它。我在下面的示例中使用了 OffsetDateTime,但可以很容易地用 LocalDateTime 替换。详细文章请参考这个网址-http://www.baeldung.com/spring-mvc-custom-data-binder

      即使我为此苦苦挣扎了一段时间,但它不起作用。诀窍是使用@Component 注释并为我做了。

      import java.time.OffsetDateTime;
      import java.time.format.DateTimeFormatter;
      
      import org.springframework.core.convert.converter.Converter;
      import org.springframework.stereotype.Component;
      
      @Component
      public class OffsetDateTimeConverter implements Converter<String, OffsetDateTime> {
      
          @Override
          public OffsetDateTime convert(final String source) {
      
              if (source == null || source.isEmpty()) {
                  return null;
              }
      
              return OffsetDateTime.parse(source, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 2022-10-15
        • 2010-10-23
        • 1970-01-01
        相关资源
        最近更新 更多