STACKJAVA

Spring MVC – Phần 13: Trả về dữ liệu định dạng XML trong Spring MVC

Spring MVC – Phần 13: Trả về dữ liệu định dạng XML trong Spring MVC

Ở bài này chúng ta sẽ thực hiện một ví dụ trả về dữ liệu định dạng XML thay vì trả về view ở controller

Ví dụ:

Spring MVC Generate XML

Khi controller không trả về view mà trả về một object với annotation @ResponseBody thì nó sẽ mặc định định dạng đối tượng trả về là XML

Cần khai báo thẻ <mvc:annotation-driven /> để spring có thể convert từ object sang xml

Thư viện sử dụng:

<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>stackjava.com</groupId>
  <artifactId>SpringMVC-XML</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
  </dependencies>
</project>

File Spring Config:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

  <context:component-scan base-package="stackjava.com.springmvc" />
  <mvc:annotation-driven />
  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
      <value>/WEB-INF/views/jsp/</value>
    </property>
    <property name="suffix">
      <value>.jsp</value>
    </property>
  </bean>

</beans>

 

Model:

package stackjava.com.springmvc.model;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "user")
@XmlType(propOrder = { "id", "name", "email" })
public class User {
  private int id;
  private String name;
  private String email;

  public User() {
  }

  public User(int id, String name, String email) {
    this.id = id;
    this.name = name;
    this.email = email;
  }

  public String getName() {
    return name;
  }

  @XmlElement
  public void setName(String name) {
    this.name = name;
  }

  public int getId() {
    return id;
  }

  @XmlElement
  public void setId(int id) {
    this.id = id;
  }

  public String getEmail() {
    return email;
  }

  @XmlElement
  public void setEmail(String email) {
    this.email = email;
  }

}

Annotation @XmlRootElement định nghĩa đây là root cho file xml

Annotation @XmlType(propOrder = { “id”, “name”, “email” }) định nghĩa thứ tự cho các thuộc tính (nếu bạn ko định nghĩa thứ thự cho các thuộc tính thì nó sẽ sắp xếp theo thứ tự bảng chữ cái)

Annotation @XmlElement định nghĩa các element cho file xml

package stackjava.com.springmvc.model;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "list-user")
public class ListUser {
  private List<User> listUser;

  public ListUser() {
  }

  public ListUser(List<User> listUser) {
    this.listUser = listUser;
  }

  public List<User> getListUser() {
    return listUser;
  }

  @XmlElement(name = "user")
  public void setListUser(List<User> listUser) {
    this.listUser = listUser;
  }

}

Khi file xml của bạn chứa 1 danh sách thì tạo 1 class chứa danh sách đó.

File Controller:

package stackjava.com.springmvc.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import stackjava.com.springmvc.model.ListUser;
import stackjava.com.springmvc.model.User;

@Controller
public class HelloController {

  @RequestMapping("/")
  public String index() {
    return "index";
  }

  @RequestMapping("/xml")
  @ResponseBody
  public User testXML() {
    User user = new User(1, "kai", "abc@gmail.com");
    return user;
  }

  @RequestMapping("/list-xml")
  @ResponseBody
  public ListUser testListXML() {
    User user1 = new User(1, "kai", "abc@gmail.com");
    User user2 = new User(2, "stack", "def@yahoo.com");
    List<User> listUser = new ArrayList<User>();
    listUser.add(user1);
    listUser.add(user2);
    ListUser list = new ListUser(listUser);
    return list;
  }

}

Với các controller trả về dữ liệu định dạng xml thì ta trả trực tiếp đối tượng và sử dụng annotation @ResponseBody

File views:

<html>
<head>
<title>index</title>
</head>
<body>
  <h1>Spring MVC Generate XML!</h1>
  <a href="xml">/xml</a> <br/>
  <a href="list-xml">/list-xml</a> <br/>
</body>
</html>

Demo:

Okay, Done!

Download code ví dụ trên tại đây

Spring MVC – Phần 13: Trả về dữ liệu định dạng XML trong Spring MVC

References:

https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc