|
|
@ -28,9 +28,6 @@ import javax.servlet.ServletContext; |
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
|
|
|
|
|
|
|
|
import org.apache.commons.logging.Log; |
|
|
|
|
|
|
|
import org.apache.commons.logging.LogFactory; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.beans.factory.BeanFactoryUtils; |
|
|
|
import org.springframework.beans.factory.BeanFactoryUtils; |
|
|
|
import org.springframework.beans.factory.InitializingBean; |
|
|
|
import org.springframework.beans.factory.InitializingBean; |
|
|
|
import org.springframework.core.Ordered; |
|
|
|
import org.springframework.core.Ordered; |
|
|
@ -87,15 +84,14 @@ import org.springframework.web.servlet.ViewResolver; |
|
|
|
* @see InternalResourceViewResolver |
|
|
|
* @see InternalResourceViewResolver |
|
|
|
* @see BeanNameViewResolver |
|
|
|
* @see BeanNameViewResolver |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport implements ViewResolver, Ordered, InitializingBean { |
|
|
|
public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport |
|
|
|
|
|
|
|
implements ViewResolver, Ordered, InitializingBean { |
|
|
|
private static final Log logger = LogFactory.getLog(ContentNegotiatingViewResolver.class); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private int order = Ordered.HIGHEST_PRECEDENCE; |
|
|
|
private int order = Ordered.HIGHEST_PRECEDENCE; |
|
|
|
|
|
|
|
|
|
|
|
private ContentNegotiationManager contentNegotiationManager; |
|
|
|
private ContentNegotiationManager contentNegotiationManager; |
|
|
|
|
|
|
|
|
|
|
|
private final ContentNegotiationManagerFactoryBean cnManagerFactoryBean = new ContentNegotiationManagerFactoryBean(); |
|
|
|
private final ContentNegotiationManagerFactoryBean cnmFactoryBean = new ContentNegotiationManagerFactoryBean(); |
|
|
|
|
|
|
|
|
|
|
|
private boolean useNotAcceptableStatusCode = false; |
|
|
|
private boolean useNotAcceptableStatusCode = false; |
|
|
|
|
|
|
|
|
|
|
@ -181,7 +177,7 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
for (int i=0; i < viewResolvers.size(); i++) { |
|
|
|
for (int i = 0; i < viewResolvers.size(); i++) { |
|
|
|
if (matchingBeans.contains(viewResolvers.get(i))) { |
|
|
|
if (matchingBeans.contains(viewResolvers.get(i))) { |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
@ -195,17 +191,18 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport |
|
|
|
"'viewResolvers' property on the ContentNegotiatingViewResolver"); |
|
|
|
"'viewResolvers' property on the ContentNegotiatingViewResolver"); |
|
|
|
} |
|
|
|
} |
|
|
|
AnnotationAwareOrderComparator.sort(this.viewResolvers); |
|
|
|
AnnotationAwareOrderComparator.sort(this.viewResolvers); |
|
|
|
this.cnManagerFactoryBean.setServletContext(servletContext); |
|
|
|
this.cnmFactoryBean.setServletContext(servletContext); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void afterPropertiesSet() { |
|
|
|
public void afterPropertiesSet() { |
|
|
|
if (this.contentNegotiationManager == null) { |
|
|
|
if (this.contentNegotiationManager == null) { |
|
|
|
this.cnManagerFactoryBean.afterPropertiesSet(); |
|
|
|
this.cnmFactoryBean.afterPropertiesSet(); |
|
|
|
this.contentNegotiationManager = this.cnManagerFactoryBean.getObject(); |
|
|
|
this.contentNegotiationManager = this.cnmFactoryBean.getObject(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public View resolveViewName(String viewName, Locale locale) throws Exception { |
|
|
|
public View resolveViewName(String viewName, Locale locale) throws Exception { |
|
|
|
RequestAttributes attrs = RequestContextHolder.getRequestAttributes(); |
|
|
|
RequestAttributes attrs = RequestContextHolder.getRequestAttributes(); |
|
|
@ -240,8 +237,8 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport |
|
|
|
ServletWebRequest webRequest = new ServletWebRequest(request); |
|
|
|
ServletWebRequest webRequest = new ServletWebRequest(request); |
|
|
|
|
|
|
|
|
|
|
|
List<MediaType> acceptableMediaTypes = this.contentNegotiationManager.resolveMediaTypes(webRequest); |
|
|
|
List<MediaType> acceptableMediaTypes = this.contentNegotiationManager.resolveMediaTypes(webRequest); |
|
|
|
acceptableMediaTypes = acceptableMediaTypes.isEmpty() ? |
|
|
|
acceptableMediaTypes = (!acceptableMediaTypes.isEmpty() ? acceptableMediaTypes : |
|
|
|
Collections.singletonList(MediaType.ALL) : acceptableMediaTypes; |
|
|
|
Collections.singletonList(MediaType.ALL)); |
|
|
|
|
|
|
|
|
|
|
|
List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request); |
|
|
|
List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request); |
|
|
|
Set<MediaType> compatibleMediaTypes = new LinkedHashSet<MediaType>(); |
|
|
|
Set<MediaType> compatibleMediaTypes = new LinkedHashSet<MediaType>(); |
|
|
@ -283,7 +280,7 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private MediaType getMostSpecificMediaType(MediaType acceptType, MediaType produceType) { |
|
|
|
private MediaType getMostSpecificMediaType(MediaType acceptType, MediaType produceType) { |
|
|
|
produceType = produceType.copyQualityValue(acceptType); |
|
|
|
produceType = produceType.copyQualityValue(acceptType); |
|
|
|
return MediaType.SPECIFICITY_COMPARATOR.compare(acceptType, produceType) < 0 ? acceptType : produceType; |
|
|
|
return (MediaType.SPECIFICITY_COMPARATOR.compare(acceptType, produceType) < 0 ? acceptType : produceType); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private List<View> getCandidateViews(String viewName, Locale locale, List<MediaType> requestedMediaTypes) |
|
|
|
private List<View> getCandidateViews(String viewName, Locale locale, List<MediaType> requestedMediaTypes) |
|
|
@ -330,8 +327,8 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport |
|
|
|
MediaType candidateContentType = MediaType.parseMediaType(candidateView.getContentType()); |
|
|
|
MediaType candidateContentType = MediaType.parseMediaType(candidateView.getContentType()); |
|
|
|
if (mediaType.isCompatibleWith(candidateContentType)) { |
|
|
|
if (mediaType.isCompatibleWith(candidateContentType)) { |
|
|
|
if (logger.isDebugEnabled()) { |
|
|
|
if (logger.isDebugEnabled()) { |
|
|
|
logger.debug("Returning [" + candidateView + "] based on requested media type '" |
|
|
|
logger.debug("Returning [" + candidateView + "] based on requested media type '" + |
|
|
|
+ mediaType + "'"); |
|
|
|
mediaType + "'"); |
|
|
|
} |
|
|
|
} |
|
|
|
attrs.setAttribute(View.SELECTED_CONTENT_TYPE, mediaType, RequestAttributes.SCOPE_REQUEST); |
|
|
|
attrs.setAttribute(View.SELECTED_CONTENT_TYPE, mediaType, RequestAttributes.SCOPE_REQUEST); |
|
|
|
return candidateView; |
|
|
|
return candidateView; |
|
|
|