spring boot + cxf rest json / xml providers

时间:2017-01-07 04:26:27

标签: spring spring-boot cxf

我实现了一个带有spring boot和cxf rest服务的简单项目,我试图找出xml / json提供程序的用途。

  • 没有提供商 CxfConfig: 当我@Produce(" application / xml")它返回给我一个有效的xml 当我@Produce(" application / json")我得到没有为类com.cxfexample.dto.User找到消息正文编写器,ContentType:application / json
  • CxfConfig的提供商:
    @Configuration
    public class CxfConfig {
    @Autowired
    private Bus bus;

    @Autowired
    MyServiceIntf peService;

    @Bean
    public Server rsServer() {
        JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();
        endpoint.setBus(bus);
        endpoint.setAddress("/");
        endpoint.setServiceBeans(Arrays.<Object>asList(peService));
        endpoint.setProviders(Arrays.asList(jacksonJaxbJsonProvider(), jaxbElementProvider()));
        return endpoint.create();
    }

    @Bean
    public JacksonJaxbJsonProvider jacksonJaxbJsonProvider() {
        return new JacksonJaxbJsonProvider();
    }

    @Bean
    public JAXBElementProvider jaxbElementProvider() {
        return new JAXBElementProvider();
    }
}

当我@Produce(&#34; application / xml&#34;) @Produce(&#34; application / json&#34;)它工作正常但是当我实现两者他们只对@Produce的第一个参数的数据格式有效({&#34; application / xml&#34;,&#34; application / json&#34;})

问题1 所以有一个xml的默认映射器,而不是Json的默认映射器?

问题2 错误消息没有为类找到消息正文编写器是指提供者的缺席或指向我的Pojo用户的注释错误?当我删除@XmlRootElement时,我也得到了application / xml产生的消息。

问题3 当我使用提供者时为什么我只得到@Produce的第一个参数的有效数据({&#34; application / xml&#34;,&#34; application / json& #34;})所以当我请求这项服务时,例如邮递员我的内容类型只是application / xml而不是两者都是

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cxfexamle</groupId>
    <artifactId>cxfexample</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>CXFExample</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- CXF RS -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
            <version>3.1.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.8.5</version>
        </dependency>
    </dependencies>

</project>
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}


@Path("/Rest")
public interface MyServiceIntf {

    @GET
    @Path("/getUser")
    @Produces({"application/json","application/xml"})
    User getUser();
}


@Service
public class MyServiceImpl implements MyServiceIntf {
    @Autowired
    User user;

    @Override
    public User getUser() {
        user.setUserName("David");
        user.setPassword("123");
        return user;
    }
}


@XmlRootElement
@Component
public class User {
    private String userName;
    private String password;

    @XmlElement    
    public String getUserName() {
        return userName;
    }
    @XmlElement
    public String getPassword() {
        return password;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    } 
    public void setPassword(String password) {
        this.password = password;
    }
}

1 个答案:

答案 0 :(得分:1)

  

问题1所以xml有一个默认映射器,而不是Json?

是的,自1.6以来,JAXB随JVM一起提供。它是一个Java to XML映射器。映射到JSON需要一个额外的库,如Jackson或Jettison

  

问题2错误消息没有找到类的消息正文编写器是指提供者的缺席或我的Pojo用户的注释错误?

这意味着CXF无法序列化对象。您需要添加序列化提供程序或配置JAXB。

  

问题3当我使用提供者为什么我只得到@Produce的第一个参数的有效数据时({“application / xml”,“application / json”})

您需要将客户端的Accept标头设置为所需的内容类型。如果您未指定任何人,CXF将根据可接受的媒体类型或@Produces中的第一个媒体类型生成响应