Search code examples
javaspringspring-bootjacksoncxf

Apache CXF (JAX-RS) with Spring Javaconfig and Jackson


How to setup Apache CXF with JAX-RS Spring Javaconfig and Jackson? I have read http://cxf.apache.org/docs/springboot.html#SpringBoot-SpringBootCXFJAX-RSStarter and http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-Jackson

It advises to use

<jaxrs:providers>
   <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
</jaxrs:providers>

but I want to stay away from XML and use plain javaconfig.

My current configuration is

@SpringBootApplication
public class Application {  
    @Autowired
    private Bus bus;

    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }

    @Bean
    public Server rsServer() {
        JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();
        endpoint.setBus(bus);
        endpoint.setAddress("/");
        endpoint.setServiceBeans(Arrays.<Object>asList(new MyService()));

        return endpoint.create();
    }   
}

Andpoint defined in my class MyService works, but when he is invoked I am getting message

org.apache.cxf.jaxrs.utils.JAXRSUtils : No message body writer has been found for class MyServiceResponse, ContentType: application/json;charset=UTF-8


Solution

  • You need to add a json Provider bean. This will act as messageProvider. Your Application class should look like this.

    import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
    
    @SpringBootApplication
    public class Application {  
        @Autowired
        private Bus bus;
    
        public static void main(String[] args) {
            SpringApplication.run(Application .class, args);
        }
    
        @Bean
        public Server rsServer() {
            List<? extends Object> providers = new ArrayList<>();
            providers.add(getJsonProvider());
            JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();
            endpoint.setProviders(providers);
            endpoint.setBus(bus);
            endpoint.setAddress("/");
            endpoint.setServiceBeans(Arrays.asList(new MyService())); 
    
            return endpoint.create();
        }
    
        @Bean
        public JacksonJsonProvider getJsonProvider() {
            new JacksonJsonProvider();
        }
    }