|
22 | 22 | import java.util.Arrays;
|
23 | 23 | import java.util.Collections;
|
24 | 24 | import java.util.HashSet;
|
25 |
| -import java.util.LinkedHashSet; |
26 | 25 | import java.util.List;
|
27 | 26 | import java.util.Locale;
|
28 | 27 | import java.util.Set;
|
@@ -210,37 +209,41 @@ protected <T> void writeWithMessageConverters(@Nullable T value, MethodParameter
|
210 | 209 | }
|
211 | 210 | }
|
212 | 211 |
|
213 |
| - HttpServletRequest request = inputMessage.getServletRequest(); |
214 |
| - List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request); |
215 | 212 |
|
216 |
| - MediaType contentType = outputMessage.getHeaders().getContentType(); |
217 |
| - List<MediaType> producibleMediaTypes = (contentType != null && contentType.isConcrete() ? |
218 |
| - Collections.singletonList(contentType) : getProducibleMediaTypes(request, valueType, declaredType)); |
| 213 | + List<MediaType> mediaTypesToUse; |
219 | 214 |
|
220 |
| - if (outputValue != null && producibleMediaTypes.isEmpty()) { |
221 |
| - throw new HttpMessageNotWritableException("No converter found for return value of type: " + valueType); |
| 215 | + MediaType contentType = outputMessage.getHeaders().getContentType(); |
| 216 | + if (contentType != null && contentType.isConcrete()) { |
| 217 | + mediaTypesToUse = Collections.singletonList(contentType); |
222 | 218 | }
|
| 219 | + else { |
| 220 | + HttpServletRequest request = inputMessage.getServletRequest(); |
| 221 | + List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request); |
| 222 | + List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request, valueType, declaredType); |
223 | 223 |
|
224 |
| - Set<MediaType> compatibleMediaTypes = new LinkedHashSet<>(); |
225 |
| - for (MediaType requestedType : requestedMediaTypes) { |
226 |
| - for (MediaType producibleType : producibleMediaTypes) { |
227 |
| - if (requestedType.isCompatibleWith(producibleType)) { |
228 |
| - compatibleMediaTypes.add(getMostSpecificMediaType(requestedType, producibleType)); |
| 224 | + if (outputValue != null && producibleMediaTypes.isEmpty()) { |
| 225 | + throw new HttpMessageNotWritableException( |
| 226 | + "No converter found for return value of type: " + valueType); |
| 227 | + } |
| 228 | + mediaTypesToUse = new ArrayList<>(); |
| 229 | + for (MediaType requestedType : requestedMediaTypes) { |
| 230 | + for (MediaType producibleType : producibleMediaTypes) { |
| 231 | + if (requestedType.isCompatibleWith(producibleType)) { |
| 232 | + mediaTypesToUse.add(getMostSpecificMediaType(requestedType, producibleType)); |
| 233 | + } |
229 | 234 | }
|
230 | 235 | }
|
231 |
| - } |
232 |
| - if (compatibleMediaTypes.isEmpty()) { |
233 |
| - if (outputValue != null) { |
234 |
| - throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes); |
| 236 | + if (mediaTypesToUse.isEmpty()) { |
| 237 | + if (outputValue != null) { |
| 238 | + throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes); |
| 239 | + } |
| 240 | + return; |
235 | 241 | }
|
236 |
| - return; |
| 242 | + MediaType.sortBySpecificityAndQuality(mediaTypesToUse); |
237 | 243 | }
|
238 | 244 |
|
239 |
| - List<MediaType> mediaTypes = new ArrayList<>(compatibleMediaTypes); |
240 |
| - MediaType.sortBySpecificityAndQuality(mediaTypes); |
241 |
| - |
242 | 245 | MediaType selectedMediaType = null;
|
243 |
| - for (MediaType mediaType : mediaTypes) { |
| 246 | + for (MediaType mediaType : mediaTypesToUse) { |
244 | 247 | if (mediaType.isConcrete()) {
|
245 | 248 | selectedMediaType = mediaType;
|
246 | 249 | break;
|
|
0 commit comments