【问题标题】:Apache CXF (JAX-RS) with Spring Javaconfig and Jackson带有 Spring Javaconfig 和 Jackson 的 Apache CXF (JAX-RS)
【发布时间】:2017-08-07 07:45:48
【问题描述】:

如何使用 JAX-RS Spring Javaconfig 和 Jackson 设置 Apache CXF? 我读过了 http://cxf.apache.org/docs/springboot.html#SpringBoot-SpringBootCXFJAX-RSStarter 和 http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-Jackson

建议使用

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

但我想远离 XML 并使用普通的 javaconfig。

我目前的配置是

@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();
    }   
}

在我的 MyService 类中定义的 Andpoint 可以工作,但是当他被调用时,我收到了消息

org.apache.cxf.jaxrs.utils.JAXRSUtils : 没有消息正文编写器 为 MyServiceResponse 类找到, 内容类型:application/json;charset=UTF-8

【问题讨论】:

    标签: java spring spring-boot jackson cxf


    【解决方案1】:

    您需要添加一个 json Provider bean。这将充当 messageProvider。您的 Application 类应如下所示。

    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();
        }
    }
    

    【讨论】:

    • @BartoszBilicki 如果这解决了问题,你能接受吗?
    • 你在哪里返回你的服务器 bean?
    • 我的ServiceBean没有默认构造函数,所以我将它定义为一个Spring bean(并使用Spring配置它),但随后CXF警告它无法实例化服务(虽然我提供了一个实例服务类而不是类)。
    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多