原文: 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
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.howtodoinjava.demo</groupId>
<artifactId>springrestexample</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>springrestexample Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Spring MVC support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>springrestexample</finalName>
</build>
</project>
注意:如果您还计划包括 JSON 支持,那么您要做的就是将 Jackson 库包含到类路径中,并且相同的 API 也将适用于 jackson。
<!-- Jackson JSON Processor -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.1</version>
</dependency>
2. Spring MVC 配置
为了创建 API,您需要像在 Spring MVC 中一样配置应用程序。
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring-servlet.xml
<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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context/
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.howtodoinjava.demo" />
<mvc:annotation-driven />
</beans>
3. JAXB 注解的模型对象
您将需要用 jaxb 注解来注解模型对象,以便 JAXB 可以将 Java 对象编组为 XML 表示形式,以发送给该 API 的客户端。
EmployeeVO.java
package com.howtodoinjava.demo.model;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement (name = "employee")
@XmlAccessorType(XmlAccessType.NONE)
public class EmployeeVO implements Serializable
{
private static final long serialVersionUID = 1L;
@XmlAttribute
private Integer id;
@XmlElement
private String firstName;
@XmlElement
private String lastName;
@XmlElement
private String email;
public EmployeeVO(Integer id, String firstName, String lastName, String email) {
super();
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public EmployeeVO(){
}
//Setters and Getters
@Override
public String toString() {
return "EmployeeVO [id=" + id + ", firstName=" + firstName
+ ", lastName=" + lastName + ", email=" + email + "]";
}
}
EmployeeListVO.java
package com.howtodoinjava.demo.model;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement (name="employees")
public class EmployeeListVO implements Serializable
{
private static final long serialVersionUID = 1L;
private List<EmployeeVO> employees = new ArrayList<EmployeeVO>();
public List<EmployeeVO> getEmployees() {
return employees;
}
public void setEmployees(List<EmployeeVO> employees) {
this.employees = employees;
}
}
4. REST 控制器
这是主类,它将决定哪个 API 将以哪种方式运行。
EmployeeRESTController.java
package com.howtodoinjava.demo.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.howtodoinjava.demo.model.EmployeeListVO;
import com.howtodoinjava.demo.model.EmployeeVO;
@RestController
public class EmployeeRESTController
{
@RequestMapping(value = "/employees")
public EmployeeListVO getAllEmployees()
{
EmployeeListVO employees = new EmployeeListVO();
EmployeeVO empOne = new EmployeeVO(1,"Lokesh","Gupta","howtodoinjava@gmail.com");
EmployeeVO empTwo = new EmployeeVO(2,"Amit","Singhal","asinghal@yahoo.com");
EmployeeVO empThree = new EmployeeVO(3,"Kirti","Mishra","kmishra@gmail.com");
employees.getEmployees().add(empOne);
employees.getEmployees().add(empTwo);
employees.getEmployees().add(empThree);
return employees;
}
@RequestMapping(value = "/employees/{id}")
public ResponseEntity<EmployeeVO> getEmployeeById (@PathVariable("id") int id)
{
if (id <= 3) {
EmployeeVO employee = new EmployeeVO(1,"Lokesh","Gupta","howtodoinjava@gmail.com");
return new ResponseEntity<EmployeeVO>(employee, HttpStatus.OK);
}
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
}
让我们记下一些重要的事情。
- 我们使用了
@RestController
注解。直到 Spring 3,我们可以使用@Controller
注解,这种情况下使用@ResponseBody
注解也很重要。@Controller
public class EmployeeRESTController
{
@RequestMapping(value = "/employees")
public @ResponseBody EmployeeListVO getAllEmployees()
{
//API code
}
}
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 示例 – 项目结构
测试 API
让我们测试以上 REST API。
1)点击网址:http://localhost:8080/springrestexample/employees
您也可以传递接受标头“application/xml
”。
Spring REST XML 示例 – 用于获取所有员工的 REST API
2)点击网址:http://localhost:8080/springrestexample/employees/1
Spring REST XML 示例 – 根据 ID 获取员工的 REST API
3)点击网址:http://localhost:8080/springrestexample/employees/123
Status Code: 404 Not Found
Content-Length: 0
Date: Fri, 18 Feb 2015 07:01:17 GMT
Server: Apache-Coyote/1.1
这就是使用 spring mvc 的 REST API 的 hello world 简单应用程序的全部内容。
学习愉快!