我的springboot学习【5】

        昨天进行了统一结果封装的问题的代码编写,今天首先要做的就是验证和应用。就用之前我学习JPA部分的那个例子,很明显DAO层和Service层是不能随便动的,我们直接去看Controller层的代码。

        改完代码,打开浏览器Apipost插件后传入数据,可以看到能将数据保存到数据库,但是报了406错误,无法解析返回的数据。因此还要回头看哪里有问题。先把代码粘一下吧。

    @PostMapping("/save")
    public Result save(@RequestBody User user){
        //System.out.println("user: "+user);
        //userService.save(user);
        return Result.success();
    }

        一上午了还没解决,现在网上太多已经过时的解决方案了。。。我使用了各种网上找到的办法依然没有解决406的问题,我打算今晚再查查资料吧,如果还不能解决就明天问一下老师。下午开始了我打算先进入springboot集成swagger的练习。

        还是先来看定义,swagger是一种实时接口文档的生成工具。在前后端分离的开发中,后端要先出接口文档,再由前端根据接口文档进行开发,最后再进行联调测试。实时接口文档和普通接口文档相比,最大的优势就是可以根据代码的变动自动更新接口文档,最大的弊端就是代码侵入性强,需要我们在项目代码中集成生成接口文档的相关代码。

        这里我查了一下资料了解历史,从后端时代过渡到前后端分离的时代,现在前端在不需要后端的条件下也能跑起来,相对独立,松耦合。前后端甚至可以部署在不同的服务器上。

        swagger分为swagger2和swagger3两个版本,前者需要引入两个jar包,后者需要一个。我将以swagger2为例进行操作。

        首先肯定还是导入依赖,如我前面所说一共有两个。

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

        接下来需要引入配置,也就是在项目中启动swagger的功能,这一步骤有两种解决方式:①在我们的springboot启动类上添加@EnableSwagger2②自定义一个配置类。这里我用第二种方式,根据我参考的一篇博客的说法:正好还可以添加一个Docket配置。,即一组接口文档的配置。

        这里我太困了就找了个讲解swagger的视频,所以进度又慢了一阵子。。。运行项目,可以发现根本运行不起来,查了查资料是版本问题导致的,因此打开yml配置文件配置spring:mvc: pathmatch: matching-strategy: ant_path_matcher。直接打开浏览器访问localhost:8080/swagger-ui.html,可以得到如下界面,这就是最基础最根本的一个swagger实例:

         看到这个界面后就可以开始配置基础信息了,这里因为实在找不到讲原理的教程,我选择查看源码试一试,看看能得到什么信息。这个说白了就是swagger的bean实例Docket,因此可以写一个简单的东西:

package com.lxc.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket docket(){
        return new Docket();
    }
}

        有了这个基础就可以通过我new出的Docket()开始发掘源码了。下面就是Docket()的源码

public Docket(DocumentationType documentationType) {
        this.apiInfo = ApiInfo.DEFAULT;
        this.groupName = "default";
        this.enabled = true;
        this.genericsNamingStrategy = new DefaultGenericTypeNamingStrategy();
        this.applyDefaultResponseMessages = true;
        this.host = "";
        this.pathMapping = Optional.absent();
        this.apiSelector = ApiSelector.DEFAULT;
        this.enableUrlTemplating = false;
        this.vendorExtensions = Lists.newArrayList();
        this.documentationType = documentationType;
    }

         这里明显看到有一个默认的组default,果然在之前界面的右上角能看到。这里能看到this.apiInfo = ApiInfo.DEFAULT,可见ApiInfo里放置的就是页面里基本的配置,我们继续点进去查看源码。

    static {
        DEFAULT = new ApiInfo("Api Documentation", "Api Documentation", "1.0", "urn:tos", DEFAULT_CONTACT, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList());
    }

        这一下就清晰的看到它是如何定义和配置界面中的内容了。显然,只要我们在代码中写一个DEFAULT覆盖这个static就可以改变上面的内容。所以我们将这段代码粘过来并进行分行就能完成目标。但是这时候我们需要知道到底需要新建一个什么类型,public Docket(DocumentationType documentationType)这里已经很明确了,所以我们要进入DocumentationType的源码查看。

public static final DocumentationType SWAGGER_12 = new DocumentationType("swagger", "1.2");
    public static final DocumentationType SWAGGER_2 = new DocumentationType("swagger", "2.0");
    public static final DocumentationType SPRING_WEB = new DocumentationType("spring-web", "1.0");
    private final MediaType mediaType;

        这下得到我所有想要的结果了。很明显 DocumentationType中的SWAGGER_2就是我寻找的目标。拿到上述这些全部信息后就可以回到我们的config页面进行编辑了。

@Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2);
    }

        想要进一步修改信息,就要通过刚刚说过的ApiInfo改变值覆盖到static上即可。这边粘过来会发现DEFAULT_CONTACT爆红,我们在源码中看到,public static final Contact DEFAULT_CONTACT = new Contact("", "", "");所以需要另外定义一个Contact类的contact,并将其放到默认的位置上。这边代码如下:

 

package com.lxc.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
    }

    Contact contact = new Contact("lxc", "http://www.baidu.com", "2384738342@qq.com");

    private ApiInfo apiInfo(){
        return new ApiInfo("lxc的swagger学习",
                            "记录了lxc的swagger学习过程",
                            "1.0",
                            "http://www.baidu.com",
                            contact,
                            "Apache 2.0",
                            "http://www.apache.org/licenses/LICENSE-2.0",
                            new ArrayList());
    }
}

        接下来重新运行项目访问,可见信息已经被成功修改。不过说实话,我真的感觉这里面就title和description有作用。不过这是我第一次通过源码来写东西,感觉还是挺有意思的。 

 

        话说回来,我之前居然没注意到这下面将我的Controller层都拿出来了,里面包含所有的接口 ,以最新的JpaController为例来看一下:

       这里我发现swagger默认将全部接口都扫描出来了,这显然是不够友好的,因为假如项目很大包含很多接口,那么寻找特定的接口就需要很长时间。所以我去搜索了一下swagger配置扫描接口的知识。经查,需要用Docket.select()来解决。

@Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.lxc.Controller"))
                .build();
    }

        重新运行可见,成功指定扫描的包。

         通过源码的阅读,swagger还提供了许多蛮有意思但是用处貌似不是很大的功能,这些都可以在select()和build()之间进行。比如enabled,默认为true,设为false会使得swagger扫描失效。

        最后是今天的总结。今天花了大量的时间在解决结果统一封装问题导致的406错误上,最终的结果仍然是能将数据存入数据库,但前端无法解析传回的数据,网上能查到的方法都没有效果。其次学习了swagger的知识,这是一种作为前后端分离的时代所必须的实时接口文档生成工具。在学习swagger过程中最大的收获是学着看源码来学习,这是一种极为清晰但是初看很烦躁的方式,我以后会尽量多看源码早日习惯,相信对未来的学习很有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值