我实现了一个带有spring boot和cxf rest服务的简单项目,我试图找出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(&#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;
}
}
答案 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
中的第一个媒体类型生成响应