spring 启动 + cxf 休息 json/xml 供应商
spring boot + cxf rest json/xml providers
我用 spring 引导和 cxf 休息服务实现了一个简单的项目,我试图弄清楚 xml/json 供应商的情况。
- 没有供应商 CxfConfig :
当我 @Produce("application/xml") 它 returns 对我来说是一个有效的 xml
当我 @Produce("application/json") 我得到 No message body writer has been found for class 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("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
中的第一个媒体类型生成响应,如果您不指定任何人
我用 spring 引导和 cxf 休息服务实现了一个简单的项目,我试图弄清楚 xml/json 供应商的情况。
- 没有供应商 CxfConfig : 当我 @Produce("application/xml") 它 returns 对我来说是一个有效的 xml 当我 @Produce("application/json") 我得到 No message body writer has been found for class 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("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
中的第一个媒体类型生成响应,如果您不指定任何人