You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2026/10/19 19:28:00 UTC
[jira] [Resolved] (CAMEL-25769) camel-core - REST binding: a GET with Content-Type text/plain is answered 500 when bindingMode is json
[ https://issues.apache.org/jira/browse/CAMEL-25769?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-25769.
---------------------------------
Resolution: Fixed
> camel-core - REST binding: a GET with Content-Type text/plain is answered 500 when bindingMode is json
> ------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25769
> URL: https://issues.apache.org/jira/browse/CAMEL-25769
> Project: Camel
> Issue Type: Bug
> Components: camel-core
> Reporter: Claus Ibsen
> Assignee: Claus Ibsen
> Priority: Minor
> Fix For: 4.24.0
>
>
> With bindingMode json, a request whose Content-Type is not JSON gets no JSON answer. A GET of a REST DSL operation that answers a Map, sent with Content-Type text/plain:
> {noformat}
> curl -H 'Content-Type: text/plain;charset=UTF-8' http://localhost:8080/orders/ORD-1002
> 500 Internal Server Error
> WARN VertxPlatformHttpConsumer : Failed handling platform-http endpoint /orders/{id}. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: java.util.LinkedHashMap to the required type: java.io.InputStream]
> {noformat}
> The same GET without a Content-Type, or with application/json, gets the order as JSON.
> Cause, in RestBindingAdvice.doMarshal: the request's Content-Type header is still on the message when the answer is made. ensureHeaderContentType keeps an existing Content-Type, so application/json is not set, and the answer is marshalled only when its Content-Type contains json. The Map is left as it is, and the HTTP consumer cannot write it. Vert.x only reports the failure; the decision is in the binding.
> The Content-Type of a request describes its body, and a GET has none. The format of the answer comes from the Accept header and what the operation produces: Spring MVC and JAX-RS answer JSON for such a GET whatever its Content-Type, when the operation declares no consumes. Most clients send no Content-Type on a GET (browsers, curl, the Java HttpClient), but some do: the Citrus HTTP client sends text/plain by default, which is how this was found, in the contracts/rest-code-first example (apache/camel-jbang-examples#118). Camel answers with a server error for a header that does not concern the answer.
> Proposal:
> * The request's Content-Type does not decide the answer. The binding remembers it when the request comes in; when the message still has that value at the end, the route did not choose a type, so the binding sets the Content-Type of its mode (application/json) and marshals.
> * A Content-Type that the route sets itself still wins, so a route can answer text/csv and skip the binding, as today.
> * A body that is already text stays as it is, so a route that answers a String to a text/plain request gets the same answer as today. Only the case that fails today changes: an object body (Map, List, POJO).
> * Tests for each of the three cases.
> _Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)