首页 文章 精选 留言 我的

精选列表

搜索[插件],共10010篇文章
优秀的个人博客,低调大师

集成 Swagger springboot 接口API插件

Swagger介绍 1.什么是Swagger 作为后端程序开发,我们多多少少写过几个后台接口项目,不管是编写手机端接口,还是目前比较火热的前后端分离项目,前端与后端都是由不同的工程师进行开发,那么这之间的沟通交流通过接口文档进行连接。但往往伴随很多问题,后端程序员认为编写接口文档及维护太花费时间精力,前端的认为接口文档变动更新不及时,导致程序之间相互调用出行问题。那么能简化接口文档的编写直接自动生成吗?当然能!如是乎Swagger这种接口文档在线自动生成工具便孕育而生。 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。 2.Swagger优点 代码变,文档变。只需要少量的注解,Swagger 就可以根据代码自动生成 API 文档,很好的保证了文档的时效性。 跨语言性,支持 40 多种语言。 Swagger UI 呈现出来的是一份可交互式的 API 文档,我们可以直接在文档页面尝试 API 的调用,省去了准备复杂的调用参数的过程。 还可以将文档规范导入相关的工具(例如 Postman、SoapUI), 这些工具将会为我们自动地创建自动化测试。 SpringBoot中整合Swagger 1.基础环境构建 首先搭建一个基础的SpringBoot项目,导入以下Swagger启动器 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter<artifactId> <version>3.0.0</version> </dependency> 编写一个用于测试的controller // java源码大全 www.1b23.com @RestController public class HelloController { @PostMapping(value = "/hello") public String hello(){ return "hello"; } } 编写Swagger的配置类 @Configuration @EnableOpenApi public class SwaggerConfig { } 运行启动输入地址:http://localhost:8080/swagger-ui/index.html 可以看到Swagger接口文档页面,说明基本配置环境成功! 注意事项: Swagger3.0版本的地址是http://localhost:8088/swagger-ui/index.html,2.x版本中访问的地址的为http://localhost:8088/swagger-ui.html 2.配置Swagger 配置Swagger首先需要构建其Bean实例Docket对象,在刚刚创建的SwaggerConfig配置类中创建一个Docket // java源码大全 www.1b23.com @Bean public Docket docket(){ return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()); } Docket(DocumentationType.OAS_30),我们这里选择的参数是DocumentationType.OAS_30,这是一个Swagger实例的接口文档版本,我们这里是3.0,所以选择用OAS_30,其他的类型还有如下几种,分别对应着Swagger历史版本 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 OAS_30 = new DocumentationType("openApi", "3.0"); 构建Docket需要创建ApiInfo实例 // java源码大全 www.1b23.com private ApiInfo apiInfo(){ // 作者信息 Contact contact = new Contact("TIOXY", "https://www.cnblogs.com/tioxy/", "1369773052@qq.com"); return new ApiInfo( "Tioxy的接口文档", "项目描述", "1.0", "https://www.cnblogs.com/tioxy/", contact, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList()); } ApiInfo主要作用是构建我们接口文档的页面显示的基础信息,展示如下位置 3.配置扫描接口及开关 构建Docket时通过select()方法配置扫描接口。Docket的完整代码如下: // java源码大全 www.1b23.com @Bean public Docket docket(Environment environment){ // 设置显示的Swagger环境 Profiles dev = Profiles.of("dev"); // 获取项目环境 boolean flag = environment.acceptsProfiles(dev); return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) // 配置Api文档分组 .groupName("TIOXY") // enable()是否启用Swagger,默认是true .enable(flag) .select() // RequestHandlerSelectors,配置要扫描接口的方式 // basePackage指定要扫描的包 // any()扫描所有,项目中的所有接口都会被扫描到 // none()不扫描 // withClassAnnotation()扫描类上的注解 // withMethodAnnotation()扫描方法上的注解 .apis(RequestHandlerSelectors.basePackage("com.tioxy.controller")) // paths()过滤某个路径 .paths(PathSelectors.any()) .build(); } groupName("TIOXY"):表示此Docket实例的名字,也就是接口文档页面右上角选择的实例名,实际开发中我们是多人开发,对应的就是多个Docket实例 enable(flag):enable()是否启用Swagger,默认是true 我们这里使用的是动态的配置是否启用Swagger,通过Environment来获取此时运行的项目环境名称,如果是dev,则定义一个flag,来动态的设置是否启用 4.实体类配置 新建一个User实体类 @ApiModel("用户实体") public class User { @ApiModelProperty("用户名") public String username; @ApiModelProperty("密码") public String password; } 只要这个实体在请求接口的返回值上(即使是泛型),都能映射到实体项中: @RequestMapping("/getUser") public User getUser(){ return new User(); } 5.常用注解 我们也可以在接口上添加注释说明,方便我们在接口文档中解释说明接口的信息,例如接口的作用、参数说明等,方便调用者使用 Swagger注解 简单说明 @Api(tags = "xxx模块说明") 作用在模块类上 @ApiOperation("xxx接口说明") 作用在接口方法上 @ApiModel("xxxPOJO说明") 作用在模型类上:如VO、BO @ApiModelProperty(value = "xxx属性说明",hidden = true) 作用在类方法和属性上,hidden设置为true可以隐藏该属性 @ApiParam("xxx参数说明") 作用在参数、方法和字段上,类似@ApiModelProperty

优秀的个人博客,低调大师

Fundebug:JavaScript插件支持错误采样

Fundebug的付费套餐主要是根据错误事件数制定的,这是因为每一个发送到我们服务器的事件,都会消耗一定的CPU、内存、磁盘以及带宽资源,尤其当错误事件数非常大时,会对我们的计算资源造成很大压力。 如果您希望采样收集错误,比如“只收集30%的错误”,可以将sampleRate属性设为0.3。这样的话,您可以选择更加合适套餐。 1. 在HTML中配置<script>标签中配置sampleRate属性 <script src="https://js.fundebug.cn/fundebug.1.9.0.min.js" apikey="API-KEY" sampleRate=0.3></script> 2. 在JavaScript中配置sampleRate变量 fundebug.sampleRate = 0.3; 注意,是否收集错误是完全随机的,因此理论上这样可能会导致一些错误不会被收集。因此,您需要自行权衡利弊,选择是否配置sampleRate以及配置多大的sampleRate。 参考 Fundebug计费标准解释:事件数是如何定义的? 版权声明 转载时请注明作者Fundebug以及本文地址:https://blog.fundebug.com/2018/05/09/fundebug-javascript-0-4-0/

优秀的个人博客,低调大师

Android 插件开发--类加载器

1). Android中类加载器 Android 中常用的类加载器有DexClassLoader和PathClassLoader,其中PathClassLoader是Android应用中的默认加载器。 DexClassLoader可以加载任何路径下的apk/dex/jar/zip PathClassLoader只能加载/data/app中的apk,也就是已经安装在手机中的apk。 2). DexClassLoader 构造方法: public DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent) ; 其中: 继承自BaseDexClassLoader dexPath: 加载apk/dex/jar/zip的路径 optimizedDirectory: 是dex的输出路径 librarySearchPath: 加载时候需要用到的lib库,一般不用 parent: DexClassLoader指定的父加载器 3). PathClassLoader 构造方法: public PathClassLoader(String dexPath, ClassLoader parent); public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent); 其中 继承自BaseDexClassLoader dexPath: 加载dex路径 librarySearchPath: 加载时候需要用到的lib库 parent: PathClassLoader指定的父加载器 dex释放路径: /data/dalvik-cache 4). 查看各种类加载器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); printMoreClassLoader(); } private static final String TAG = "MainActivity"; /** * 打印各种类加载器 */ private void printMoreClassLoader() { Log.d(TAG, "Context类的类加载器:" + Context.class.getClassLoader()); Log.d(TAG, "ListView类的类加载器:" + ListView.class.getClassLoader()); Log.d(TAG, "应用程序默认的类加载器:" + getClassLoader()); Log.d(TAG, "系统类加载器:" + ClassLoader.getSystemClassLoader()); Log.d(TAG, "系统类加载器和Context类的类加载器是否相等:" + (Context.class.getClassLoader() ==ClassLoader.getSystemClassLoader())); Log.d(TAG, "系统类加载器和应用程序默认加载器是否相等:" + (getClassLoader() == ClassLoader.getSystemClassLoader())); Log.d(TAG, "================================================"); Log.d(TAG, "打印应用程序默认加载器的委派机制:"); ClassLoader classLoader = getClassLoader(); while (null != classLoader) { Log.d(TAG, "类加载器: " + classLoader); classLoader = classLoader.getParent(); } Log.d(TAG, "================================================"); Log.d(TAG, "打印系统加载器的委派机制:"); classLoader = ClassLoader.getSystemClassLoader(); while (null != classLoader) { Log.d(TAG, "类加载器:" + classLoader); classLoader = classLoader.getParent(); } } 打印结果: Context类的类加载器:java.lang.BootClassLoader@8b6e11e ListView类的类加载器:java.lang.BootClassLoader@8b6e11e 应用程序默认的类加载器:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.mazaiting.dynamicjar-2/base.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.mazaiting.dynamicjar-2/lib/arm64, /system/lib64, /vendor/lib64]]] 系统类加载器:dalvik.system.PathClassLoader[DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib64, /vendor/lib64, /system/lib64, /vendor/lib64]]] 系统类加载器和Context类的类加载器是否相等:false 系统类加载器和应用程序默认加载器是否相等:false ================================================ 打印应用程序默认加载器的委派机制: 类加载器: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.mazaiting.dynamicjar-2/base.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.mazaiting.dynamicjar-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.mazaiting.dynamicjar-2/lib/arm64, /system/lib64, /vendor/lib64]]] 类加载器: java.lang.BootClassLoader@8b6e11e ================================================ 打印系统加载器的委派机制: 类加载器:dalvik.system.PathClassLoader[DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib64, /vendor/lib64, /system/lib64, /vendor/lib64]]] 类加载器:java.lang.BootClassLoader@8b6e11e

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册