AbstractMessageConverterMethodProcessor results in 406 with "Accept: */*" when @RequestMapping produces condition determined the content type
See original GitHub issueFollowing #23205 I found a similar issue.
If you declare a controller like this:
@GetMapping(path = "/xml", produces = "application/xml")
public Map<String, Object> producesContentTypeThatIsNotSupportedByAnyConverter() {
return ImmutableMap.of("foo", "bar");
}
And make a request like this (httpie):
http -v :9080/xml
Then the result will be:
GET /xml HTTP/1.1
Accept: */*
...
HTTP/1.1 406
...
AbstractMessageConverterMethodProcessor#writeWithMessageConverters
method will throw org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
.
This is very similar case to a case with ResponseEntity
- the server is responsible for selecting content-type application/xml
(if it is acceptable by a client, and in this case - it is) and no converters found that can write the result using this content-type.
The Accept
header was taken into account but it was Accept: */*
so it is obviously not “Could not find acceptable representation” case, but more like a “Cound not find http message converter for totally acceptable representation” (application/xml
is acceptable for a client, that requsted it with Accept: */*
).
So it is strange to receive a 406 result for a request with Accept: */*
header. The real problem in this case is a server misconfiguration: the server declares that it produces application/xml
, but at the same time it didn’t register any HttpMessageConverter
that can return this content type. How can this be a 4xx then?
Issue Analytics
- State:
- Created 4 years ago
- Reactions:1
- Comments:6 (5 by maintainers)
Yes, that is my point. 406 should be returned only when server is unable to select the type requested by a client. But in the mentioned case the server can select it. It just unable to write the response because of server misconfiguration.
Re-opening, closed in error due to incorrect issue reference from above commit.