Docsify/springboot/chapter4-SpringMVC.md
2023-06-13 16:37:18 +08:00

5.1 KiB
Raw Blame History

MVC设置

  • @Controller修饰class用来创建处理http请求的对象
  • @RestControllerSpring4之后加入的注解原来在@Controller中返回json需要@ResponseBody来配合如果直接用@RestController替代@Controller就不需要再配置@ResponseBody默认返回json格式。
  • @RequestMapping配置url映射
    • value 请求路径 例如:@RequestMapping(value="/a/b"),则该方法对应的路径即为/a/b
    • 在请求中可以以Ant通配符的方式配置路径,例如:@RequestMapping(value="/*/b") 表示a/b、c/b等各个请求均可以访问到该方法而@RequestMapping(value="/**/b")则表示1/2/b3/4/b都可以访问到该方法单个*号表示任意字符通配符,两个星号代表任意路径通配符
  • @PathVariable("id") 配置rest请求中的可变路径参数
  • @ModelAttribute 配置参数对象,前端可通过传递对象中的属性值来填充该对象
  • @RequestParam 配置参数,对应名值对的形式
  • @RequestBody 配置请求参数该数据一个请求只有一个且请求类型不能为get类型

Swagger2配置

由于接口众多并且细节复杂需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等高质量地创建这份文档本身就是件非常吃力的事下游的抱怨声不绝于耳。 随着时间推移,不断修改接口实现的时候都必须同步修改接口文档,而文档与代码又处于两个不同的媒介,除非有严格的管理机制,不然很容易导致不一致现象。 为了解决上面这样的问题本文将介绍RESTful API的重磅好伙伴Swagger2它可以轻松的整合到Spring Boot中并与Spring MVC程序配合组织出强大RESTful API文档。

简单来说swagger就是用来自动生成Spring MVC文档的工具接口开发完毕后无需手动再修改接口文档直接让客户端/前端人员查看swagger生成的文档即可。

  • 首先在pom.xml中导入swagger2的依赖
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.2.2</version>
</dependency>
  • 构建swagger的配置类
/**
 * swagger的配置文件
 * */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Value("${baseUrl}")
    private String baseUrl;

    @Bean
    public Docket createRestRequestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                // 配置ApiInfo级当前应用的基本信息
                .apiInfo(getAppInfo())
                // 生成DocketBuilder
                .select()
                // 指定api类生成的包名,swagger会自动扫描指定包下的所有类生成说明文档
                .apis(RequestHandlerSelectors.basePackage("com.xiaoxiao.springboot2.controller"))
                // 指定实现了RestController接口的类生成说明文档
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                // 路径过滤规则,多数情况下不需要过滤
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo getAppInfo(){
        return new ApiInfoBuilder()
                .title("api文档")
                .description("小小的api文档说明")
                .contact(new Contact("xiaoxiao", null, "xiaoyan159@163.com"))
                .version("V0.1")
                .termsOfServiceUrl(baseUrl)
                .build();
    }
}

注意上面Docket的apis方法只有一个会生效因此如果需要扫描不同包的controller的类及方法可使用withClassAnnotation方式

此刻直接访问localhost:8080/swagger-ui.html即可看到自动生成的说明文档但是这些说明文档是自动生成的可读性不高可通过在controller上增加注解的方式提高文档可读性

@ApiImplicitParams(
            @ApiImplicitParam(name = "user", dataType = "User", allowEmptyValue = false, required = true)
    )
@ApiOperation(value = "打印snapSwitch配置信息", notes = "注意:")
  • 访问静态资源(图片、音频等文件)

springboot中访问静态资源是按照如下顺序寻找的

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/
  • /

如果需要自定义静态资源位置可以在application.properties中增加配置

  • spring.resources.static-locations=classpath:/
  • spring.mvc.static-path-pattern=/**
  • 关于跨域

    解决跨域问题springboot中可以通过两种方式

    1. 在请求上添加注解@CrossOrigin(value ="http://localhost:8081")
    2. 通过下面的代码
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer{  
      @Override
      public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/**").allowedOrigins("http://localhost:8081").allowedMethods("*").allowedHeaders("*");
      }
    }