@ -22,7 +22,6 @@ import java.util.ArrayList;
@@ -22,7 +22,6 @@ import java.util.ArrayList;
import java.util.Arrays ;
import java.util.Collections ;
import java.util.HashSet ;
import java.util.LinkedHashSet ;
import java.util.List ;
import java.util.Locale ;
import java.util.Set ;
@ -210,37 +209,41 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
@@ -210,37 +209,41 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe
}
}
HttpServletRequest request = inputMessage . getServletRequest ( ) ;
List < MediaType > requestedMediaTypes = getAcceptableMediaTypes ( request ) ;
MediaType contentType = outputMessage . getHeaders ( ) . getContentType ( ) ;
List < MediaType > producibleMediaTypes = ( contentType ! = null & & contentType . isConcrete ( ) ?
Collections . singletonList ( contentType ) : getProducibleMediaTypes ( request , valueType , declaredType ) ) ;
List < MediaType > mediaTypesToUse ;
if ( outputValue ! = null & & producibleMediaTypes . isEmpty ( ) ) {
throw new HttpMessageNotWritableException ( "No converter found for return value of type: " + valueType ) ;
MediaType contentType = outputMessage . getHeaders ( ) . getContentType ( ) ;
if ( contentType ! = null & & contentType . isConcrete ( ) ) {
mediaTypesToUse = Collections . singletonList ( contentType ) ;
}
else {
HttpServletRequest request = inputMessage . getServletRequest ( ) ;
List < MediaType > requestedMediaTypes = getAcceptableMediaTypes ( request ) ;
List < MediaType > producibleMediaTypes = getProducibleMediaTypes ( request , valueType , declaredType ) ;
Set < MediaType > compatibleMediaTypes = new LinkedHashSet < > ( ) ;
for ( MediaType requestedType : requestedMediaTypes ) {
for ( MediaType producibleType : producibleMediaTypes ) {
if ( requestedType . isCompatibleWith ( producibleType ) ) {
compatibleMediaTypes . add ( getMostSpecificMediaType ( requestedType , producibleType ) ) ;
if ( outputValue ! = null & & producibleMediaTypes . isEmpty ( ) ) {
throw new HttpMessageNotWritableException (
"No converter found for return value of type: " + valueType ) ;
}
mediaTypesToUse = new ArrayList < > ( ) ;
for ( MediaType requestedType : requestedMediaTypes ) {
for ( MediaType producibleType : producibleMediaTypes ) {
if ( requestedType . isCompatibleWith ( producibleType ) ) {
mediaTypesToUse . add ( getMostSpecificMediaType ( requestedType , producibleType ) ) ;
}
}
}
}
if ( compatibleMediaTypes . isEmpty ( ) ) {
if ( outputValue ! = null ) {
throw new HttpMediaTypeNotAcceptableException ( producibleMediaTypes ) ;
if ( mediaTypesToUse . isEmpty ( ) ) {
if ( outputValue ! = null ) {
throw new HttpMediaTypeNotAcceptableException ( producibleMediaTypes ) ;
}
return ;
}
return ;
MediaType . sortBySpecificityAndQuality ( mediaTypesToUse ) ;
}
List < MediaType > mediaTypes = new ArrayList < > ( compatibleMediaTypes ) ;
MediaType . sortBySpecificityAndQuality ( mediaTypes ) ;
MediaType selectedMediaType = null ;
for ( MediaType mediaType : mediaTypes ) {
for ( MediaType mediaType : mediaTypesToUse ) {
if ( mediaType . isConcrete ( ) ) {
selectedMediaType = mediaType ;
break ;