2017-01-07 3 views
1

Я реализую простой проект с функцией загрузки весны и cxf rest, и я пытаюсь выяснить, что происходит с поставщиками xml/json. неspring boot + cxf rest json/xml providers

  • нет поставщиков наCxfConfig: , когда я @Produce ("приложение/XML") он возвращает мне действительный XML , когда я @Produce ("приложения/JSON") я получаю Нет тело сообщения писателя было найдено для класса com.cxfexample.dto.User, ContentType: приложения/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 («приложение/XML») или @Produce («приложение/JSON») он работает нормально, но когда я реализовать как из них я получить действительный только DataFormat первого аргумента @ Produce ({"application/xml", "application/json"})

Вопрос 1, так что для xml используется не по умолчанию, а для Json?

Вопрос 2 ошибка сообщение Ни один писатель тела сообщения не был найден для класса относится к absense провайдера или ошибку аннотации к моей Pojo пользователю? Когда я удалить @XmlRootElement я получаю также это сообщение для application/xml.

Вопрос 3 когда я использую провайдер, почему я получить достоверные данные только для первого аргумента @Produce ({ «приложение/XML», «применение/JSON»}) и поэтому, когда я запросить этот сервис, например, с почтальон моего типа контента является единственным приложением/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

Вопрос 1 так что картограф по умолчанию для XML, а не для Json?

Да, JAXB поставляется с JVM с 1,6. Это Java-конвертер. Преобразование в формат JSON требует дополнительной библиотеки, как Джексон или отстрелить

Вопроса 2, сообщение об ошибке Нет писатель тела сообщения не был найден для класса относится к absense провайдера или ошибкам аннотаций к моей Pojo пользователю?

Это означает, что CXF не может сериализовать объект. Вам нужно добавить поставщика сериализации или настроить JAXB.

Вопрос 3, когда я использую провайдер, почему я получить достоверные данные только для первого аргумента @Produce ({ "приложение/XML", "применение/JSON"})

Вам нужно установите заголовок Accept с клиентской стороны на нужный тип содержимого.CXF будет генерировать ответ в соответствии с допустимыми типами носителей или первым в @Produces, если вы не указали никого

Смежные вопросы