2014-11-19 2 views
3

Мне нужен вывод данных о загрузке Spring для xml и NOT json. Я поставил в моем хранилище объектов:Как использовать Spring Boot Rest Data для возврата xml

@RequestMapping(value="/findByID", method=RequestMethod.GET, headers = { "Accept=application/xml" }, produces="application/xml") 
MyXmlAnnotatedObject findById(@Param("id") BigInteger id); 

Я также добавил следующее к моему ПОМ зависимостями

<dependency> 
     <groupId>com.fasterxml.jackson.dataformat</groupId> 
     <artifactId>jackson-dataformat-xml</artifactId> 
     <version>2.4.3</version> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.woodstox</groupId> 
     <artifactId>woodstox-core-asl</artifactId> 
     <version>4.4.1</version> 
    </dependency> 

Но когда я пытаюсь

http://localhost:9000/factset/search/findByID?id=18451 

Я все еще получаю JSON. Мне действительно нужен XML для моих пользователей Любые идеи?

+2

То, что возвращается, зависит от ваших принимающих заголовков. Убедитесь, что вы отправляете запрос о том, что хотите XML. Для этого вам не нужна дополнительная настройка. Также ваш код не имеет ничего общего с Spring Data Rest, поскольку вы пишете все самостоятельно, а не полагаетесь на конечные точки Spring Spring. –

+1

Аннотации «@ RequestMapping» в методе репозитория не только бесполезны, но и не имеют никакого смысла. Репозиторий уже отображен. – zeroflagL

ответ

4

RequestMapping аннотации не работает в репозиториях. Методы репозитория не позволяют изменять формат результата (по умолчанию JSON). Если вы хотите, чтобы ваша служба возвращала данные в формате XML, вам необходимо создать простой @Controller.

@Controller 
public class RestEndpoint { 

    @Autowired 
    private SomeRepository someRepository; 

    @RequestMapping(value="/findByID", method=RequestMethod.GET, produces=MediaType.APPLICATION_XML_VALUE) 
    public @ResponseBody MyXmlAnnotatedObject findById(@Param("id") BigInteger id) { 

     return someRepository.findById(id); 
    } 

} 

UPD: Вот ссылка на официальной документации Spring: http://docs.spring.io/spring-data/rest/docs/2.1.4.RELEASE/reference/html/repository-resources.html

**3.6 The query method resource** 
The query method resource executes the query exposed through an individual query method on the repository interface. 

**3.6.1 Supported HTTP methods** 

As the search resource is a read-only resource it supports GET only. 

**GET** 

Returns the result of the query execution. 

**Parameters** 

If the query method has pagination capabilities (indicated in the URI template pointing to the resource) the resource takes the following parameters: 

page - the page number to access (0 indexed, defaults to 0). 
size - the page size requested (defaults to 20). 
sort - a collection of sort directives in the format ($propertyname,)+[asc|desc]?. 
**Supported media types** 

application/hal+json 
application/json 
0

Код ниже отлично работает в моем приложении для возвращения содержимого XML

XML RESPONSE FORMAT

Код:


  @SpringBootApplication 
      @Configuration 
      @ComponentScan 
      @EnableAutoConfiguration 
      @EnableScheduling 
      public class Application extends SpringBootServletInitializer{ 



       public static void main(String[] args) { 
        SpringApplication.run(Application.class, args); 
       } 

       @Override 
       protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
        return application.sources(Application.class); 
       } 

       private static Class<Application> applicationClass = Application.class; 

      } 

============================================================================================================================================================================================ =============================

 @RestController 
     public class PersonController { 

      @Autowired 
      private PersonRepository personRepository; 

      @RequestMapping(value = "/persons/{id}", method = RequestMethod.GET,produces={MediaType.APPLICATION_XML_VALUE},headers = "Accept=application/xml") 
      public ResponseEntity<?> getPersonDetails(@PathVariable Long id, final HttpServletRequest request)throws Exception { 
       Person personResponse=personRepository.findPersonById(id); 
       return ResponseEntity.ok(personResponse); 
      } 

     } 

============== ================================================== ======

POM.xml 
-------- 


       <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.subu</groupId> 
       <artifactId>SpringBootExamples</artifactId> 
       <version>0.0.1-SNAPSHOT</version> 
       <packaging>war</packaging> 
       <parent> 
        <groupId>io.spring.platform</groupId> 
        <artifactId>platform-bom</artifactId> 
        <version>2.0.1.RELEASE</version> 
       </parent> 
       <properties> 
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
        <java.version>1.7</java.version> 
       </properties> 
       <repositories> 
        <repository> 
         <id>vaadin-addons</id> 
         <url>http://maven.vaadin.com/vaadin-addons</url> 
         <snapshots> 
          <enabled>true</enabled> 
         </snapshots> 
        </repository> 
       </repositories> 
       <dependencies> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-starter</artifactId> 
        </dependency> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-devtools</artifactId> 
        </dependency> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-starter-data-jpa</artifactId> 
        </dependency> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-starter-jdbc</artifactId> 
        </dependency> 
        <dependency> 
         <groupId>com.vaadin</groupId> 
         <artifactId>vaadin-spring-boot-starter</artifactId> 
         <version>1.0.1</version> 
        </dependency> 
        <dependency> 
         <groupId>org.postgresql</groupId> 
         <artifactId>postgresql</artifactId> 
         <scope>runtime</scope> 
        </dependency> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-starter-tomcat</artifactId> 
         <scope>provided</scope> 
        </dependency> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-starter-test</artifactId> 
         <scope>test</scope> 
        </dependency> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-starter-web</artifactId> 
         <exclusions> 
          <exclusion> 
           <groupId>org.springframework.boot</groupId> 
           <artifactId>spring-boot-starter-tomcat</artifactId> 
          </exclusion> 
         </exclusions> 
        </dependency> 
        <dependency> 
         <groupId>com.google.guava</groupId> 
         <artifactId>guava</artifactId> 
        </dependency> 
        <dependency> 
         <groupId>com.vaadin.tapio</groupId> 
         <artifactId>googlemaps</artifactId> 
         <version>1.3.4</version> 
        </dependency> 
        <dependency> 
         <groupId>commons-beanutils</groupId> 
         <artifactId>commons-beanutils</artifactId> 
        </dependency> 
        <dependency> 
         <groupId>commons-collections</groupId> 
         <artifactId>commons-collections</artifactId> 
        </dependency> 
        <dependency> 
         <groupId>org.freemarker</groupId> 
         <artifactId>freemarker</artifactId> 
        </dependency> 
        <dependency> 
         <groupId>mysql</groupId> 
         <artifactId>mysql-connector-java</artifactId> 
         <version>5.1.38</version> 
        </dependency> 
        <dependency> 
         <groupId>com.zaxxer</groupId> 
         <artifactId>HikariCP</artifactId> 
         <version>2.4.5</version> 
        </dependency> 
        <dependency> 
         <groupId>com.fasterxml.jackson.dataformat</groupId> 
         <artifactId>jackson-dataformat-xml</artifactId> 
        </dependency> 
         <dependency> 
        <groupId>org.codehaus.woodstox</groupId> 
        <artifactId>woodstox-core-asl</artifactId> 
        <version>4.4.1</version> 
       </dependency> 
        <dependency> 
         <groupId>org.eclipse.persistence</groupId> 
         <artifactId>eclipselink</artifactId> 
         <version>2.6.2</version> 
        </dependency> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-starter-security</artifactId> 
        </dependency> 
       </dependencies> 
       <dependencyManagement> 
        <dependencies> 
         <dependency> 
          <groupId>com.vaadin</groupId> 
          <artifactId>vaadin-bom</artifactId> 
          <version>7.7.3</version> 
          <type>pom</type> 
          <scope>import</scope> 
         </dependency> 
        </dependencies> 
       </dependencyManagement> 

       <build> 
        <plugins> 
         <plugin> 
          <groupId>org.springframework.boot</groupId> 
          <artifactId>spring-boot-maven-plugin</artifactId> 
         </plugin> 
        </plugins> 
       </build> 
      </project> 
+0

Получение этой ошибки -> Произошла непредвиденная ошибка (type = Not Acceptable, status = 406). Не удалось найти приемлемое представление –

+0

поделиться своим кодом –

1

Пожалуйста, не вините меня за некрофилии, но я создал пример, который делает именно то, что вам нужно: https://github.com/sergpank/spring-boot-xml

Короче говоря, вы должны сказать, к платформе, что вам нужно XML в заголовке запроса POST (если вы используете инструмент, как Почтальон для тестирования):

Accept : application/xml 
Content-Type : application/xml 

ИЛИ это будет сделано автоматически, если будет создана XML сообщение конвертер RestTemplate:

public class RestfulClient { 

    public static void main(String[] args) { 
     RestTemplate restTemplate = new RestTemplate(Arrays.asList(new Jaxb2RootElementHttpMessageConverter())); 

     Contact random = restTemplate.getForObject("http://localhost:8080/contact/random", Contact.class); 
     System.out.println("Received: " + random); 

     Contact edited = restTemplate.postForObject("http://localhost:8080/contact/edit", random, Contact.class); 
     System.out.println("Edited: " + edited); 
    } 
} 

и не забудьте аннотировать вам класс с @XmlRootElement и @XmlElement аннотациями (если вы предпочитаете JAXB):

@AllArgsConstructor 
@NoArgsConstructor 
@ToString 
@Setter 
@XmlRootElement 
public class Contact implements Serializable { 
    @XmlElement 
    private Long id; 

    @XmlElement 
    private int version; 

    @Getter private String firstName; 

    @XmlElement 
    private String lastName; 

    @XmlElement 
    private Date birthDate; 

    public static Contact randomContact() { 
     Random random = new Random(); 
     return new Contact(random.nextLong(), random.nextInt(), "name-" + random.nextLong(), "surname-" + random.nextLong(), new Date()); 
    } 
} 

методы в контроллере должны также иметь @RequestBody аннотацию XML и распаковать @ResponseBody аннотацию к маршалу ответ обратно XML.

@Controller 
@RequestMapping(value="/contact") 
public class ContactController { 
    final Logger logger = LoggerFactory.getLogger(ContactController.class); 

    @RequestMapping("/random") 
    @ResponseBody 
    public Contact randomContact() { 
     return Contact.randomContact(); 
    } 

    @RequestMapping(value = "/edit", method = RequestMethod.POST) 
    @ResponseBody 
    public Contact editContact(@RequestBody Contact contact) { 
     logger.info("Received contact: {}", contact); 
     contact.setFirstName(contact.getFirstName() + "-EDITED"); 
     return contact; 
    } 
} 
Смежные вопросы