spring 启动 + cxf 休息 json/xml 供应商

spring boot + cxf rest json/xml providers

我用 spring 引导和 cxf 休息服务实现了一个简单的项目,我试图弄清楚 xml/json 供应商的情况。

    @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("application/xml") or @Produce("application/json") 它工作正常但是当我实现 both 其中我只对 @Produce({"application/xml","application/json"})

的第一个参数的数据格式有效

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

问题2错误信息No message body writer has been found for class指的是提供者不在或我的 Pojo 用户的注释错误?当我删除 @XmlRootElement 时,我还收到了 application/xml 产品的这条消息。

问题 3 当我使用提供程序时,为什么我只获取 @Produce({"application/xml","application/json"}) 的第一个参数的有效数据因此,当我请求此服务时,例如邮递员,我的内容类型仅为 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;
    }
}

Question 1 so there is a default mapper for xml and not for Json?

是的,JAXB 从 1.6 开始随 JVM 一起提供。它是一个 Java 到 XML 的映射器。映射到 JSON 需要额外的库,例如 Jackson 或 Jettison

Question 2 the error message No message body writer has been found for class refers to the provider's absense or to an annotation error to my Pojo User?

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

Question 3 when i use providers why i get valid data only the for the first argument of @Produce({"application/xml","application/json"})

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