Hi

Are you sure you want to set the Content-Type: Accept
I think this is wrong.

The content type is what the structure of the message body is, such as
xml, plain text, json, etc.

However there is a HTTP Accept header that a client can use to tell
the server what content-type the client can accept (handle) as
response.
Then the server can use that to find out what to send back.



On Thu, Jul 1, 2021 at 8:04 AM Calle Andersson
<calleanders...@hotmail.com> wrote:
>
> Hi,
>
>
>
> I’m migrating some Camel projects from Camel 2.17 to 3.4.
>
>
>
> I have a Camel REST DSL based route in which I try to manually set the 
> ”Content-Type” HTTP header of the response. However, no matter what values I 
> try to set in the route, the only values shown in the responses are either 
> ”application/xml” or ”application/json” (depending on if I requested XML or 
> JSON in the Accept HTTP header when calling the REST endpoint).
>
>
>
> My route is implemented in the following way (and I always call the REST 
> endpoint with the ”Accept” HTTP header set to either 
> ”application/my.dummy.mediatype+xml” or 
> ”application/my.dummy.mediatype+json”):
>
> restConfiguration()
>
>     .component("servlet")
>
>     .skipBindingOnErrorCode(true)
>
>     .bindingMode(RestBindingMode.json_xml)
>
>     .endpointProperty("servletName", "CamelServletDummy");
>
>
>
> rest().tag("Dummy")
>
>     .get("dummy")
>
>         
> .produces("application/my.dummy.mediatype+xml,application/my.dummy.mediatype+json")
>
>         .outType(DummyJaxbAnnotatedClass.class)
>
>         .route()
>
>             .process(exchange -> {
>
>                 exchange.getIn().setBody(new DummyJaxbAnnotatedClass());
>
>             })
>
>             .setHeader(Exchange.CONTENT_TYPE, header("Accept"))
>
>         .endRest();
>
>
>
> The main difference between 2.17 and 3.4 seems to be that the following code 
> has been added to JaxbDataFormat in 3.4 (for implementation details, see 
> https://github.com/apache/camel/blob/camel-3.4.x/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java#L174:
>
> if (contentTypeHeader) {
>
>     if (exchange.hasOut()) {
>
>         exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "application/xml");
>
>     } else {
>
>         exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/xml");
>
>     }
>
> }
>
>
>
> Similar code has beed added to JacksonDataFormat (for implementation details, 
> see 
> https://github.com/apache/camel/blob/camel-3.4.x/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonDataFormat.java#L160).
>
>
>
> contentTypeHeader is set to true as default in both JaxbDataFormat and 
> JacksonDataFormat.
>
>
>
> I have been trying to find a way to configure this but hasn’t found any. Is 
> there a way to configure contentTypeHeader when implementing a route the way 
> I do? If not, is it possible to add this option in upcoming Camel versions? 
> Is there any workarounds without having to change binding mode to ”off” and 
> ”manually” handle the marshalling to either XML or JSON messages?
>
>
>
> Thanks in advance,
>
> Calle



-- 
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2

Reply via email to