James Howe opened SPR-14201 and commented
For example, I'm trying to receive an HTTP date header:
@RequestHeader(HttpHeaders.IF_MODIFIED_SINCE) Optional<Instant> ifModifiedSince
but this results in a conversion error
org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type [java.lang.String] to required type [java.util.Optional]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:115)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:99)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
... 88 more
Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestHeader java.time.Instant] for value 'Thu, 21 Apr 2016 17:11:08 +0100'
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:192)
at org.springframework.core.convert.support.ObjectToOptionalConverter.convert(ObjectToOptionalConverter.java:75)
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:192)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:173)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:108)
at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:64)
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:47)
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:688)
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:107)
... 91 more
Caused by: java.time.format.DateTimeParseException: Text 'Thu, 21 Apr 2016 17:11:08 +0100' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.Instant.parse(Instant.java:395)
at org.springframework.format.datetime.standard.InstantFormatter.parse(InstantFormatter.java:40)
at org.springframework.format.datetime.standard.InstantFormatter.parse(InstantFormatter.java:35)
at org.springframework.format.support.FormattingConversionService$ParserConverter.convert(FormattingConversionService.java:194)
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35)
... 101 more
I tried to add @DateTimeFormat
but it is unwieldy - the only built-ins are ISO-8601 formats. It's not possible to specify Java 8's DataTimeFormatter.RFC_1123_DATE_TIME
to this annotation.
Given that all HTTP date/time headers should be using the RFC 1123 format, shouldn't that be the default for @RequestHeader
conversion? There should at least be better formatter integration with java.time
classes.
I'm running in a Spring Boot 1.3.3 context, if that makes any difference.
Affects: 4.2.5
Issue Links:
- #18143 @DateTimeFormat
's JSR-310 formatter is not strict in case of pattern
- #18922 Support locale parameter to DateTimeFormat annotation
Referenced from: commits https://github.com/spring-projects/spring-framework/commit/9412f7a0948c954742eb4a4aabcaf1c2fe0605c7
Comment From: spring-projects-issues
Juergen Hoeller commented
This seems to work fine for java.util.Date
arguments... The problem is rather that our InstantConverter
simply delegates to Instant.parse(String)
; we might have to make this a bit smarter by default. For the time being, you'd have to register your own converter for java.time.Instant
with the MVC ConversionService
, overriding Spring's default one.
Comment From: spring-projects-issues
Juergen Hoeller commented
Since standard java.util.Date
parsing is equally lenient there, I've added explicit support for RFC-1123 conversion to our InstantFormatter
, making this available not only to @RequestHeader
but to any conversion from String
to Instant
. We simply 'smartly' adapt to the ISO Instant format as well as to RFC-1123 now. This will be available in 4.3 RC2.
Comment From: OrangeDog
Well I'm back trying to do this again, and it doesn't seem to be fixed in Spring 5.3. Same exception.
Comment From: sbrannen
Hi @OrangeDog,
Please do not comment on issues closed several years ago (2016).
Instead, if you think you have encountered an issue with a recent, supported version of the Spring Framework, please create a new issue with details and an example.
Thanks
Comment From: OrangeDog
I'm just trying to clarify whether this was actually done, or just closed without any changes.
Comment From: sbrannen
I'm just trying to clarify whether this was actually done, or just closed without any changes.
Then please read through the entire issue and all comments before asking such questions, because that information is present on this page.
This will be available in 4.3 RC2.
Referenced from: commits https://github.com/spring-projects/spring-framework/commit/9412f7a0948c954742eb4a4aabcaf1c2fe0605c7