Spring @RequestParam DateTime格式为ISO 8601日期可选时间

yst*_*ark 6 java spring-mvc jodatime

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

相信我,我已经看到了所有这些相关的问题,我已经可以告诉人们会指出我,例如这个这个,等等.

以前,我正在使用日期String,然后使用上面提到的服务层中的joda格式化程序处理它,但现在我想在控制器中添加请求验证,这意味着如果请求在语法上不正确,请求不应该甚至去服务层.

我已经尝试过使用多种变体@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);
}
Run Code Online (Sandbox Code Playgroud)

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

div*_*gon 7

您还可以创建一个转换器来处理它。我在下面的示例中使用了 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);
    }
}
Run Code Online (Sandbox Code Playgroud)