spring mvc 创建 rest api

本文介绍如何使用Spring MVC搭建RESTful API服务,包括环境搭建、基本配置、接口定义及web.xml配置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境搭建

常用搭建rest api方式有两种:
  • 利用ContentNegotiatingViewResolver
  • 利用ResponseBody 和Http信息转换器。
我采用第二种方式,因为它将控制器产生的数据直接转化为客户端的表述形式。和第一种比,减少了模型和视图概念。只有控制器产生的数据和message converter 转换数据之后资源表述。
       下面开始搭建spring mvc环境
  •      定义基于maven的pom
<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.taoto.springl</groupId>
  <artifactId>japi-rest</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>japi-rest</name>
  <url>http://maven.apache.org</url>

  <properties>

    <!-- Generic properties -->
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <tomcat.version>8.5.2</tomcat.version>

    <!-- Spring -->
    <spring-io-platform.version>2.0.6.RELEASE</spring-io-platform.version>
    <spring-data-jdbc.version>1.1.0.RELEASE</spring-data-jdbc.version>

    <!-- Test -->
    <assertj.version>2.2.0</assertj.version>

    <!-- Dates -->
    <jodatime-hibernate.version>1.3</jodatime-hibernate.version>
    <jodatime-jsptags.version>1.1.1</jodatime-jsptags.version>
    <jadira-usertype-core.version>3.2.0.GA</jadira-usertype-core.version>

    <!-- Others -->
    <mysql-driver.version>5.1.36</mysql-driver.version>
    <org.slf4j-version>1.6.2</org.slf4j-version>
  </properties>

  <dependencyManagement>
    <!-- Import the maven Spring IO Platform Bill Of Materials (BOM) -->
    <dependencies>
      <dependency>
        <groupId>io.spring.platform</groupId>
        <artifactId>platform-bom</artifactId>
        <version>${spring-io-platform.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- @Inject -->
    <dependency>
      <groupId>javax.inject</groupId>
      <artifactId>javax.inject</artifactId>
      <version>1</version>
    </dependency>

    <!-- java ee api -->
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>${tomcat.version}</version>
      <scope>provided</scope>
    </dependency>
   <!-- <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>-->

    <!--spring-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
    </dependency>
    <!-- Logging with SLF4J & LogBack -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>${org.slf4j-version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
    </dependency>
    <!-- used for EhCacheCacheManager -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
    </dependency>

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <scope>runtime</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <defaultGoal>install</defaultGoal>
    <testResources>
      <testResource>
        <!-- declared explicitly so Spring config files can be placed next to their corresponding JUnit test class  -->
        <directory>${project.basedir}/src/test/java</directory>
      </testResource>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
          <compilerArguments>
            <Xlint/>
          </compilerArguments>
          <verbose>true</verbose>
          <source>${java.version}</source>
          <target>${java.version}</target>
          <showWarnings>true</showWarnings>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.13</version>
        <configuration>
          <includes>
            <include>**/*Tests.java</include>
          </includes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <warName>japi-rest</warName>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.9</version>
        <configuration>
          <downloadSources>true</downloadSources>
          <downloadJavadocs>true</downloadJavadocs>
          <wtpversion>2.0</wtpversion>
          <sourceIncludes>
            <sourceInclude>**/*.*</sourceInclude>
          </sourceIncludes>
          <additionalBuildcommands>
            <buildCommand>
              <name>org.springframework.ide.eclipse.core.springbuilder</name>
            </buildCommand>
            <buildCommand>
              <name>org.eclipse.m2e.core.maven2Builder</name>
            </buildCommand>
          </additionalBuildcommands>
          <additionalProjectnatures>
            <projectnature>org.eclipse.jdt.core.javanature</projectnature>
            <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
            <projectnature>org.eclipse.m2e.core.maven2Nature</projectnature>
          </additionalProjectnatures>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>


    </plugins>
    <finalName>japi-rest</finalName>
  </build>
</project>
  • spring mvc 基本配置
 <context:component-scan
        base-package="com.taoto.japi"/>

    <mvc:annotation-driven/>

    <!--  all resources inside folder src/main/webapp/resources are mapped so they can be refered to inside JSP files
        (see htmlHeader.jsp for more details) -->
    <mvc:resources mapping="/resources/**" location="/resources/"/>

    <mvc:view-controller path="/" view-name="welcome"/>

    <!-- serve static resources (*.html, ...) from src/main/webapp/
    Required when both servlet-mapping is '/' and static resources need to be served -->
    <mvc:default-servlet-handler/>
    <mvc:view-resolvers>
        <mvc:content-negotiation use-not-acceptable="true">
            <mvc:default-views>
                <bean class="org.springframework.web.servlet.view.JstlView">
                    <property name="url" value=""/>
                </bean>
            </mvc:default-views>
        </mvc:content-negotiation>

        <!-- Registering BeanNameViewResolver and InternalViewResolver -->
        <mvc:bean-name/>
        <mvc:jsp prefix="/WEB-INF/jsp/" suffix=".jsp"/>
    </mvc:view-resolvers>
   
  • 接口层定义
     
package com.taoto.japi.web;

import com.google.common.collect.Maps;
import com.taoto.japi.constant.StatusCode;
import com.taoto.japi.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;
import java.util.Map;

/**
 * Created by Administrator on 2016/7/17 0017.
 */
@Controller
@RequestMapping(value="/user")
public class UserController implements BindingResultMessage{

    @RequestMapping(value = "/new", method = RequestMethod.POST,consumes = "application/json")
    @ResponseBody
    public Map<String,Object> save(@RequestBody @Valid User user, BindingResult result) {

        Map<String,Object> retMap = Maps.newHashMap();
        if (result.hasErrors()) {
            return toMessage(result);
        } else {
            System.out.println("新增用户成功");
            retMap.put("statusCode", StatusCode.SUCCESS);
            retMap.put("result", "success");
            return retMap;
        }
    }

    @RequestMapping(value = "/new2", method = RequestMethod.POST)
    @ResponseBody
    public Map<String,Object> save2(@Valid User user, BindingResult result) {

        Map<String,Object> retMap = Maps.newHashMap();
        if (result.hasErrors()) {
            return toMessage(result);
        } else {
            System.out.println("新增用户成功");
            retMap.put("statusCode", StatusCode.SUCCESS);
            retMap.put("result", "success");
            return retMap;
        }
    }
}

  • web.xml 配置
  
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/applicationContext*.xml </param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/mvc-core-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>



  <!-- Enables support for DELETE and PUT request methods with web browser clients -->
  <filter>
  <filter-name>hiddenHttpMethodFilter</filter-name>
  <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>

  <filter-mapping>
  <filter-name>hiddenHttpMethodFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>


  <display-name>japi-rest</display-name>
</web-app>

通过上面配置 就是先基本的一个rest 接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值