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

ContentNegotiatingViewResolver does not support wildcards in contentType

    Details

      Description

      The following configuration won't work for accept headers containing e.g. application/vnd.foo.user+json (see also http://stackoverflow.com/questions/11880359/spring-mvc-3-1-1-contentnegotiatingviewresolver-how-to-use-wildcard-characters):

          <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
              <property name="order" value="1"/>
              <property name="favorPathExtension" value="false"/>
              <property name="defaultViews">
                  <list>
                      <!-- JSON View -->
                      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                          <property name="contentType" value="application/*+json"/>
                      </bean>                 
                  </list>
              </property>
          </bean>
      

      The reason is a wrong comparison in ContentNegotiatingViewResolver#getBestView:

      Current:

              for (MediaType mediaType : requestedMediaTypes) {
                  for (View candidateView : candidateViews) {
                      if (StringUtils.hasText(candidateView.getContentType())) {
                          MediaType candidateContentType = MediaType.parseMediaType(candidateView.getContentType());
                          if (mediaType.includes(candidateContentType)) {
                              if (logger.isDebugEnabled()) {
                                  logger.debug("Returning [" + candidateView + "] based on requested media type '"
                                          + mediaType + "'");
                              }
                              return candidateView;
                          }
                      }
                  }
              }
      

      The problem is application/vnd.foo.user+json does not include application/*+json, the opposite is true.

      Expected:

      if (candidateContentType.includes(mediaType)) {
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                rstoya05-aop Rossen Stoyanchev
                Reporter:
                axe-felix Felix Barnsteiner
                Last updater:
                Chris Beams
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:
                  Days since last comment:
                  6 years, 8 weeks, 4 days ago