Dave Riseley created CAMEL-23249:
------------------------------------

             Summary: CXF RS Rest service loses content-type with stream 
caching enabled
                 Key: CAMEL-23249
                 URL: https://issues.apache.org/jira/browse/CAMEL-23249
             Project: Camel
          Issue Type: Bug
          Components: camel-cxfrs
    Affects Versions: 4.14.5
            Reporter: Dave Riseley


When Camel is used to host a CXF JaxRS rest service and stream caching is 
enabled, the content-type is lost from the jaxrs Response object.  

This has happened since CAMEL-22414 implemented support for stream caching 
jakarta.ws.rs.core.Response objects.

This can be demonstrated with the following test:

{code:java}
    @Autowired
    ProducerTemplate producerTemplate;

    @Configuration
    static class TestConfig {

        @Bean
        SpringJAXRSServerFactoryBean restServer(Bus bus) {
            SpringJAXRSServerFactoryBean restServer = new 
SpringJAXRSServerFactoryBean();
            restServer.setBus(bus);
            restServer.setAddress("http://localhost:8001/rs";);
            restServer.setServiceClass(EchoService.class);
            return restServer;
        }

        @Bean
        EchoService echoService() {
            return new EchoServiceImpl();
        }

        @Bean
        RoutesBuilder echoRoute() {
            return new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("cxfrs:bean:restServer")
                        .streamCache(true)
                        .bean(EchoService.class)
                        .log(LoggingLevel.INFO, "Logging body: ${body}");
                }
            };
        }
    }

    private interface EchoService {
        @GET
        @Path("/echoVariable")
        public Response echoVariable(@QueryParam("say") String say);
    }

    private static class EchoServiceImpl implements EchoService {
        @Override
        public Response echoVariable(String say) {
            return Response
                .status(Status.OK)
                .type(MediaType.APPLICATION_JSON)
                .entity("{ \"message\":\""+ say +"\" }")
                .build();
        }
    }

    @Test
    void testEchoVariable() {
        Exchange responseExchange = 
producerTemplate.send("http://localhost:8001/rs/echoVariable?throwExceptionOnFailure=false&say=hello";,
 e -> {});
        assertNull(responseExchange.getException());
        assertEquals(200, 
responseExchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE, 
Integer.class));
        assertEquals("application/json", 
responseExchange.getMessage().getHeader(Exchange.CONTENT_TYPE, String.class));
        assertEquals("{ \"message\":\"hello\" }", 
responseExchange.getMessage().getBody(String.class));
    }
{code}

This test fails with Camel 4.14.2 (or later) - the content type of 
"application/octet-stream" is returned instead of the expected 
"application/json".  It passes with Camel 4.14.1, or if stream caching is 
disabled.

A full reproducer is here, which can just be run with mvn clean install:

https://github.com/driseley/cxf-responsecaching-test






--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to