Как использовать Spring Boot Rest Data для возврата xml
Мне нужно, чтобы выходные данные Spring загружались в формате xml, а не в json. Я поместил в свой репозиторий объект:
@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 для моих пользователей. Есть идеи?
3 ответа
Аннотация 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
Пожалуйста, не вините меня за некрофилию, но я создал пример, который делает именно то, что вам нужно: https://github.com/sergpank/spring-boot-xml
Вкратце вы должны сообщить платформе, что вам нужен XML в заголовке запроса POST (если вы используете для тестирования такой инструмент, как Postman):
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;
}
}
Приведенный ниже код прекрасно работает в моем приложении для возврата содержимого XML
Код:
@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>