原文: https://howtodoinjava.com/spring-restful/spring-rest-hello-world-xml-example/

在这个 Spring REST XML 示例中,我正在使用 Spring REST 功能编写 REST API 的世界示例。 在此示例中,我将创建两个 API,这些 API 将返回资源的 XML 表示形式。

下载源码

1. Maven 依赖

让我们从运行时依赖关系开始,您需要编写这些 REST API。 实际上,您只需要 Spring MVC 支持。

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.howtodoinjava.demo</groupId>
  5. <artifactId>springrestexample</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>springrestexample Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <dependencies>
  11. <dependency>
  12. <groupId>junit</groupId>
  13. <artifactId>junit</artifactId>
  14. <version>4.12</version>
  15. <scope>test</scope>
  16. </dependency>
  17. <!-- Spring MVC support -->
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-webmvc</artifactId>
  21. <version>4.1.4.RELEASE</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-web</artifactId>
  26. <version>4.1.4.RELEASE</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-core</artifactId>
  31. <version>4.1.4.RELEASE</version>
  32. </dependency>
  33. </dependencies>
  34. <build>
  35. <finalName>springrestexample</finalName>
  36. </build>
  37. </project>

注意:如果您还计划包括 JSON 支持,那么您要做的就是将 Jackson 库包含到类路径中,并且相同的 API 也将适用于 jackson。

  1. <!-- Jackson JSON Processor -->
  2. <dependency>
  3. <groupId>com.fasterxml.jackson.core</groupId>
  4. <artifactId>jackson-databind</artifactId>
  5. <version>2.4.1</version>
  6. </dependency>

2. Spring MVC 配置

为了创建 API,您需要像在 Spring MVC 中一样配置应用程序。

web.xml

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4. <web-app>
  5. <display-name>Archetype Created Web Application</display-name>
  6. <servlet>
  7. <servlet-name>spring</servlet-name>
  8. <servlet-class>
  9. org.springframework.web.servlet.DispatcherServlet
  10. </servlet-class>
  11. <load-on-startup>1</load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>spring</servlet-name>
  15. <url-pattern>/</url-pattern>
  16. </servlet-mapping>
  17. </web-app>

spring-servlet.xml

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context/
  8. http://www.springframework.org/schema/context/spring-context.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  11. <context:component-scan base-package="com.howtodoinjava.demo" />
  12. <mvc:annotation-driven />
  13. </beans>

3. JAXB 注解的模型对象

您将需要用 jaxb 注解来注解模型对象,以便 JAXB 可以将 Java 对象编组为 XML 表示形式,以发送给该 API 的客户端。

EmployeeVO.java

  1. package com.howtodoinjava.demo.model;
  2. import java.io.Serializable;
  3. import javax.xml.bind.annotation.XmlAccessType;
  4. import javax.xml.bind.annotation.XmlAccessorType;
  5. import javax.xml.bind.annotation.XmlAttribute;
  6. import javax.xml.bind.annotation.XmlElement;
  7. import javax.xml.bind.annotation.XmlRootElement;
  8. @XmlRootElement (name = "employee")
  9. @XmlAccessorType(XmlAccessType.NONE)
  10. public class EmployeeVO implements Serializable
  11. {
  12. private static final long serialVersionUID = 1L;
  13. @XmlAttribute
  14. private Integer id;
  15. @XmlElement
  16. private String firstName;
  17. @XmlElement
  18. private String lastName;
  19. @XmlElement
  20. private String email;
  21. public EmployeeVO(Integer id, String firstName, String lastName, String email) {
  22. super();
  23. this.id = id;
  24. this.firstName = firstName;
  25. this.lastName = lastName;
  26. this.email = email;
  27. }
  28. public EmployeeVO(){
  29. }
  30. //Setters and Getters
  31. @Override
  32. public String toString() {
  33. return "EmployeeVO [id=" + id + ", firstName=" + firstName
  34. + ", lastName=" + lastName + ", email=" + email + "]";
  35. }
  36. }

EmployeeListVO.java

  1. package com.howtodoinjava.demo.model;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.xml.bind.annotation.XmlRootElement;
  5. @XmlRootElement (name="employees")
  6. public class EmployeeListVO implements Serializable
  7. {
  8. private static final long serialVersionUID = 1L;
  9. private List<EmployeeVO> employees = new ArrayList<EmployeeVO>();
  10. public List<EmployeeVO> getEmployees() {
  11. return employees;
  12. }
  13. public void setEmployees(List<EmployeeVO> employees) {
  14. this.employees = employees;
  15. }
  16. }

4. REST 控制器

这是主类,它将决定哪个 API 将以哪种方式运行。

EmployeeRESTController.java

  1. package com.howtodoinjava.demo.controller;
  2. import org.springframework.http.HttpStatus;
  3. import org.springframework.http.ResponseEntity;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import com.howtodoinjava.demo.model.EmployeeListVO;
  9. import com.howtodoinjava.demo.model.EmployeeVO;
  10. @RestController
  11. public class EmployeeRESTController
  12. {
  13. @RequestMapping(value = "/employees")
  14. public EmployeeListVO getAllEmployees()
  15. {
  16. EmployeeListVO employees = new EmployeeListVO();
  17. EmployeeVO empOne = new EmployeeVO(1,"Lokesh","Gupta","howtodoinjava@gmail.com");
  18. EmployeeVO empTwo = new EmployeeVO(2,"Amit","Singhal","asinghal@yahoo.com");
  19. EmployeeVO empThree = new EmployeeVO(3,"Kirti","Mishra","kmishra@gmail.com");
  20. employees.getEmployees().add(empOne);
  21. employees.getEmployees().add(empTwo);
  22. employees.getEmployees().add(empThree);
  23. return employees;
  24. }
  25. @RequestMapping(value = "/employees/{id}")
  26. public ResponseEntity<EmployeeVO> getEmployeeById (@PathVariable("id") int id)
  27. {
  28. if (id <= 3) {
  29. EmployeeVO employee = new EmployeeVO(1,"Lokesh","Gupta","howtodoinjava@gmail.com");
  30. return new ResponseEntity<EmployeeVO>(employee, HttpStatus.OK);
  31. }
  32. return new ResponseEntity(HttpStatus.NOT_FOUND);
  33. }
  34. }

让我们记下一些重要的事情。

  • 我们使用了@RestController注解。直到 Spring 3,我们可以使用@Controller注解,这种情况下使用@ResponseBody注解也很重要。
    1. @Controller
    2. public class EmployeeRESTController
    3. {
    4. @RequestMapping(value = "/employees")
    5. public @ResponseBody EmployeeListVO getAllEmployees()
    6. {
    7. //API code
    8. }
    9. }

Spring 4 引入了@RestController,它是@Controller + @ResponseBody的组合。 因此,在使用@RestController时,无需使用@ResponseBody。 它是可选的。

  • 在这里,我们依靠 Spring MVC HttpMessageConverter将对象转换为用户请求的 xml 表示形式。@ResponseBody注解(通过@RestController包含)告诉 Spring MVC 应该将方法的结果用作响应的主体。
    正如我们想要的 XML 一样,这种封送处理由 Spring 提供的Jaxb2RootElementHttpMessageConverter完成,如果在类路径中找到 JAXB 库,则会在 Spring 上下文中自动注册。 由于我正在使用 JRE 7 运行此应用程序,并且它具有内置的 JAXB,因此不需要通过 maven 添加外部依赖项。

  • 由于有了@ResponseBody注解,我们不再需要视图名称,而只需返回员工对象。

  • 您可以将它们包装在ResponseEntity中,而不是直接返回java对象。 ResponseEntity是 Spring MVC 中的一个类,与 HTTP 状态代码一起用作结果主体的对象的包装。
    这样可以更好地控制您在各种用例中返回给客户端的内容。 例如如果找不到给定员工 ID 的员工,则返回 404 错误。

5. 项目结构

Spring REST XML 响应示例 - 图1

Spring REST XML 示例 – 项目结构

测试 API

让我们测试以上 REST API。

1)点击网址:http://localhost:8080/springrestexample/employees

您也可以传递接受标头“application/xml”。

Spring REST XML 响应示例 - 图2

Spring REST XML 示例 – 用于获取所有员工的 REST API

2)点击网址:http://localhost:8080/springrestexample/employees/1

Spring REST XML 响应示例 - 图3

Spring REST XML 示例 – 根据 ID 获取员工的 REST API

3)点击网址:http://localhost:8080/springrestexample/employees/123

  1. Status Code: 404 Not Found
  2. Content-Length: 0
  3. Date: Fri, 18 Feb 2015 07:01:17 GMT
  4. Server: Apache-Coyote/1.1

这就是使用 spring mvc 的 REST API 的 hello world 简单应用程序的全部内容。

下载源码

学习愉快!