Spring REST XML 响应示例

Spring REST XML 响应示例

原文: 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 Example - Project Structure

Spring REST XML 示例 – 项目结构

测试 API

让我们测试以上 REST API。

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

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

Spring REST XML Example - REST API for get all employees

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

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

Spring REST XML Example - REST API for get employee by id

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 简单应用程序的全部内容。

下载源码

学习愉快!