2015-09-18 95 views
4

我用Spring Boot 1.2.5做了简单的休息webservice,它对json很好,但是我不能让这个工作返回xml。支持XML的Spring Boot REST

这是我的控制器:

@RestController 
.. 
@RequestMapping(method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) 
@ResponseStatus(HttpStatus.OK) 
public List<Activity> getAllActivities() { 
    return activityRepository.findAllActivities(); 
} 

当我把它与接受:应用/ JSON一切正常,但是当我与应用程序/ xml的尝试,我得到一些HTML与406错误和消息:

The resource identified by this request is only capable of generating responses 
with characteristics not acceptable according to the request "accept" headers. 

我的模型对象:

@XmlRootElement 
public class Activity { 

    private Long id; 
    private String description; 
    private int duration; 
    private User user; 
    //getters & setters... 
} 

@XmlRootElement 
public class User { 

    private String name; 
    private String id; 
    //getters&setters... 
} 


我的pom.xml

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.2.5.RELEASE</version> 
    <relativePath /> <!-- lookup parent from repository --> 
</parent> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </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> 

</dependencies> 

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

我是否需要一些额外的罐子在我的pom.xml,以使这项工作?我试图添加jaxb-api或者jax-impl,但它没有帮助。

+0

你确定你将它设置为'应用程序/ xml'而不是别的?启用调试日志记录并查看里面发生了什么。 –

+0

你能分享你的POM文件吗! – Avis

+0

@Avis我粘贴我的pom.xml – jgr

回答

12

要在春季启动这项工作,而无需使用泽西我们需要添加这种依赖性:

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

输出将有点难看,但它的作品:

<ArrayList 
    xmlns=""> 
    <item> 
     <id/> 
     <description>Swimming</description> 
     <duration>55</duration> 
     <user/> 
    </item> 
    <item> 
     <id/> 
     <description>Cycling</description> 
     <duration>120</duration> 
     <user/> 
    </item> 
</ArrayList> 

这里是很好的教程: http://www.javacodegeeks.com/2015/04/jax-rs-2-x-vs-spring-mvc-returning-an-xml-representation-of-a-list-of-objects.html

-1

请试试这个

public @ResponseBody getAllActivities() { 

,而不是

public List<Activity> getAllActivities() { 
+0

我使用RestController注释,所以我不需要ResponseBody我编辑我的问题。而我的JSON工作正常,只有XML没有。 – jgr

-1

我们可以如下做到这一点:

代码


 package com.subu; 

     import java.io.Serializable; 

     import javax.persistence.Entity; 
     import javax.persistence.GeneratedValue; 
     import javax.persistence.Id; 
     import javax.persistence.Table; 
     import javax.xml.bind.annotation.*; 

     @Entity 
     @XmlRootElement(name = "person") 
     @Table(name="person") 

     public class Person implements Serializable{ 
      private static final long serialVersionUID = 1L; 

      @Id 
      @GeneratedValue 
      private Long id; 

      @XmlAttribute(name = "first-name") 
      private String first_name; 

      public Long getId() { 
       return id; 
      } 

      public void setId(Long id) { 
       this.id = id; 
      } 

      public String getFirst_name() { 
       return first_name; 
      } 

      public void setFirst_name(String first_name) { 
       this.first_name = first_name; 
      } 

      public String getLast_name() { 
       return last_name; 
      } 

      public void setLast_name(String last_name) { 
       this.last_name = last_name; 
      } 

      public String getDate_of_birth() { 
       return date_of_birth; 
      } 

      public void setDate_of_birth(String date_of_birth) { 
       this.date_of_birth = date_of_birth; 
      } 

      @XmlAttribute(name = "last-name") 
      private String last_name; 

      @XmlAttribute(name = "dob") 
      private String date_of_birth; 


     } 

 @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); 
      } 

     } 

 package com.subu; 

     import org.springframework.boot.SpringApplication; 
     import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
     import org.springframework.boot.autoconfigure.SpringBootApplication; 
     import org.springframework.boot.builder.SpringApplicationBuilder; 
     import org.springframework.boot.context.web.SpringBootServletInitializer; 
     import org.springframework.context.annotation.ComponentScan; 
     import org.springframework.context.annotation.Configuration; 
     import org.springframework.scheduling.annotation.EnableScheduling; 


     @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; 

     } 

ScreenShot

+1

你知道这是一个java主题,当答案是数百行代码+配置 – EralpB