Uploaded image for project: 'Spring Framework'
  1. Spring Framework
  2. SPR-14201

@RequestHeader doesn't accept RFC-1123 for conversion to java.time.Instant

    XMLWordPrintable

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Major
    • Resolution: Complete
    • Affects Version/s: 4.2.5
    • Fix Version/s: 4.3 RC2
    • Component/s: Web
    • Labels:
      None
    • Last commented by a User:
      true

      Description

      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.

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              juergen.hoeller Juergen Hoeller
              Reporter:
              jamesmhowe James Howe
              Last updater:
              Spring Issuemaster
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved:
                Days since last comment:
                1 year, 40 weeks, 6 days ago