1.TDengine 资深研发整理:基于 SpringBoot 多语言实现 API 返回消息国际化
2.编程中为什么用spring?
3.spring的编写流程(spring流程编排)
4.spring api è¿ååè¿è½ç»§ç»è¿è¡ä»£ç
5.API管理工具Swagger介绍及Springfox原理分析
6.求shop++的源代码
TDengine 资深研发整理:基于 SpringBoot 多语言实现 API 返回消息国际化
SpringBoot,作为Java开发领域广受欢迎的技术框架,在构建Web应用程序和微服务方面发挥着重要作用。它通过简化开发流程、提供约定大于配置的原则以及集成常用库和组件,助力开发者高效构建应用程序。gta4源码
为了帮助开发者更好地掌握SpringBoot,我们整理了TDengine资深研发的内部分享——《SpringBoot 多语言支持方案》,供开发者参考。
在项目依赖中引入spring-boot-starter和spring-boot-autoconfigure两个包,即可使用SpringBoot提供的多语言定义和解析工具。在spring-boot-autoconfigure的源码中,可以看到MessageSourceAutoConfiguration类已自动装配了MessageSource对象。
在IDEA中,在resources资源包上右键新建资源包,填写资源包名如:messages,选择区域设置,包括en、zh_CN、zh_TC等选项。在resources包内即可看到绑定的小妹sms压力测试源码多语言文件。
在配置文件中添加message,格式为:{ code}={ message}。在业务模块中使用多语言消息,首先分析API服务请求响应流程,包括身份认证、API接口鉴权认证、权限识别等,验证通过后进入业务逻辑,最后通过接口返回。
异常国际化配置可以通过定义多语言message和获取LocaleMessageProvider实现。SpringBoot框架通过LocaleContextHolder.getLocale()获取Locale,并在RequestContextFilter中设置LocaleContext。
客户端在请求中添加Accept-Language=zh-CN头,即可验证返回的结果。例如,登录出错时,客户端接收到的信息为国际化后的错误信息。
以上就是基于SpringBoot多语言支持方案的完整分享,希望对开发者有所帮助。如有其他技术问题或时序数据处理难题,急速拉升段指标源码可联系TDengine的技术研发人员进行沟通。
TDengine是一款高性能、集群开源、云原生的时序数据库,专为物联网、工业互联网、电力、IT运维等场景设计。它具有内建的缓存、流式计算、数据订阅等系统功能,降低系统设计复杂度和研发运营成本。TDengine提供TDengine Enterprise和TDengine Cloud两个版本,用户可根据需求选择。
编程中为什么用spring?
1、Spring能有效地组织你的中间层对象;2、Spring能消除在许多工程中常见的对Singleton的过多使用;
3、 通过一种在不同应用程序和项目间一致的方法来处理配置文件,消除各种自定义格式的属性文件的需要,仅仅需要看看类的威廉均线指标源码JavaBean属性。Inversion of Control的使用帮助完成了这种简化;(使用的是type2的IoC)
4、 能够很容易培养你面向接口而不是面向类的编程习惯。
5、 Spring的设计会让使用它创建的应用尽可能少的依赖于它的APIs,在Spring应用中的大多数业务对象没有依赖于Spring。
6、 使用Spring构建的应用程序易于单元测试;
7、 Spring使EJB成为一个实现选择,而不是必需的选择。你可以用POJOs或local EJBs来实现业务接口,却不会影响到调用代码。
8、 Spring提供一些web应用上的EJB的替代方案,比如用AOP提供声明性事务管理;
9、 Spring为数据存取提供了一个一致的框架,不论是使用JDBC还是O/R mapping的产品(Hibernate,JDO)。
、 也是个人体会最深的一点,它可以替代部分配置文件,易推创意类似源码甚至有效减少源代码的编写量。
1)方便解耦,简化开发(高内聚、低耦合);
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理。
2)AOP编程的支持;
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能,声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程。
3)方便集成各种优秀框架;
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis等)的直接支持。
4)降低JavaEE API的使用难度;
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
spring的编写流程(spring流程编排)
springmvc工作流程
springmvc工作流程:
1、用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。
2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)。
3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller。
4、HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet。
5、DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。
6、DispatcherServlet将模型数据填充到视图中。
7、DispatcherServlet将结果响应给用户。
组件说明:
DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度。
HandlerMapping:处理器映射器,它根据用户访问的URL映射到对应的后端处理器Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。
HandlerAdapter:处理器适配器,它调用后端处理器中的方法,返回逻辑视图ModelAndView对象。
ViewResolver:视图解析器,将ModelAndView逻辑视图解析为具体的视图(如JSP)。
Handler:后端处理器,对用户具体请求进行处理,也就是我们编写的Controller类。
spring工作流程
写得太笼统了,不过,spring+hibernate得基本工作流是分层得.
也许是:
reg页面是前台表单录入视图,提交后到RegController控制器,然后其中又封装了User和Reg得vo对象,在RegController中调用UserDAOImpl和RegImpl执行数据得保存,UserDAO是接口,UserDAOImpl实现了此接口.UserDAOImpl和RegImpl使用hibernate能力进行ROM映射,保存对象到数据库.regsuccess是保存数据成功后得返回视图.
spirngmvc需要配置控制器映射,将访问映射到控制器上,控制器调用dao或是services层得api执行业务逻辑,然后返回视图和模型对象给前置控制器,前置控制器根据返回得信息派发视图.
Spring启动流程(一)以java-config形式编写一个测试demo,新建一个AnnotationConfigApplicationContext,如果是XML形式使用ClassPathXmlApplicationContext;
两者都继承了AbstractApplicationContext类,详细看下面的层次图。
注意:在newAnnotationConfigApplicationContext()时如果未指定参数,会报运行时异常:org.springframework.context.annotation.AnnotationConfigApplicationContext@6ebca6hasnotbeenrefreshedyet
AnnotationConfigApplicationContext的有参构造执行了3个方法,分别是自己的无参构造、register()、refresh();
在描述前先从网上找了一个总体流程图方便了解一下大致流程,理清思路。
在执行AnnotationConfigApplicationContext的无参构造方法前会调用父类GenericApplicationContext的无参构造方法;
GenericApplicationContext中实例化一个DefaultListableBeanFactory,也就是说bean工厂实际上是应用上下文的一个属性;
从上面的类层次图可以看到:应用上下文和bean工厂又同时实现了BeanFactory接口。
前面讲到我们为了解IOC使用了Spring提供的AnnotationConfigApplicationContext作为入口展开,那Spring怎么对加了特定注解(如@Service、@Repository)的类进行读取转化成BeanDefinition对象呢?
又如何对指定的包目录进行扫描查找bean对象呢?
所以我们需要new一个注解配置读取器和一个路径扫描器。
AnnotatedBeanDefinitionReader中执行了AnnotationConfigUtils中的registerAnnotationConfigProcessors(this.registry)方法,会向容器注册Sprign内置的处理器。
registerAnnotationConfigProcessors方法中通过newRootBeanDefinition(XX.class)新建一个RootBeanDefinition(BeanDefinition的一个实现),然后调用registerPostProcessor将内置bean对应的BeanDefinition保存到bean工厂中;
这里需要说明的是:我们刚刚一直在谈到注册bean,实际上就是将内置bean对应的beanDefinition保存到bean工厂中。那为什么要保存beanDefinition呢?因为Spring是跟据beanDefinition中对bean的描述,来实例化对象的,就算自己定义的bean也是要被解析成一个beanDefinition并注册的。
其中最主要的组件便是ConfigurationClassPostProcessor和AutowiredAnnotationBeanPostProcessor,前者是一个beanFactory后置处理器,用来完成bean的扫描与注入工作,后者是一个bean后置处理器,用来完成@AutoWired自动注入。
这个步骤主要是用来解析用户传入的Spring配置类,解析成一个BeanDefinition然后注册到容器中,主要源码如下:
通过生成AnnotatedGenericBeanDefinition,然后解析给BeanDefinition的其他属性赋值,然后将BeanDefinition和beanName封装成一个BeanDefinitionHolder对象注册到bean工厂中(就是将beanName与baenDefinition封装到Map中,将beanName放到list中。Map与list都是bean工厂DefaultListableBeanFactory所维护的属性),和前面内置bean的注册相同。
执行到这一步,register方法到此就结束了,通过断点观察BeanFactory中的beanDefinitionMap属性可以看出:this()和this.register(componentClasses)方法中就是将内置bean和我们传的配置bean的beanDefinition进行了注册,还没处理标记了@Component等注解的自定义bean。
spring api è¿ååè¿è½ç»§ç»è¿è¡ä»£ç
å¯ä»¥éè¿nohupæ¥å®ç°å ³æsshè¿æ¥å项ç®è¿æ¯ä¼å¨æå¡å¨ä¸è¿è¡ã
è¾å ¥å½ä»¤nohupjava-jar项ç®å.jarå车ä¹åä¼æ¾ç¤ºè¿ç¨å·ï¼è¿ä¸ªè¿ç¨å·å°±æ¯ä½ ç项ç®åå°è¿è¡çè¿ç¨å·ãnohupï¼ä¸ææçæ§è¡å½ä»¤ï¼å¿½ç¥ææçææä¿¡å·ãè¿è¡åå°å½ä»¤æåå &å¨jarç®å½ä¸ä¼çæä¸ä¸ªnohup.outæ件ï¼é»è®¤çlogè¾åºå°è¿éäºãä¸é¢çå½ä»¤è¡¨ç¤ºä¸ææçåå°å¯å¨demo.jarã
API管理工具Swagger介绍及Springfox原理分析
Swagger,作为全球最受欢迎的API管理工具,提供了一整套全面的API管理解决方案,包括在线编辑器、UI展示界面和代码生成器等实用功能。
在选择API管理工具时,Springfox是一个优秀的选择,它能自动解析Spring容器中Controller暴露的接口,并通过界面展示或调用。以下是一个使用Springfox的简单API展示界面示例。
Springfox起源于swagger-springmvc,专为SpringMVC和Swagger的集成而设计。在SpringBoot项目中应用Springfox,通常需要以下步骤:配置完成后,通过访问'mons-lang-2.6
commons-beanutils-1.9.2
commons-collections-3.2.1
commons-io-2.4
commons-net-3.3
commons-fileupload-1.3.1
commons-codec-1.
commons-email-1.3.3
commons-compress-1.9
junit-4.
.biboheart.demos.apiï¼è¿ä¸ªå éæ¾ç½®APIæ¥å£çRestController
å¨com.biboheart.demos.apiå ä¸å建ä¸ä¸ªclass:ParamControllerãè¿ç« ç示ä¾é½å¨è¿ä¸ªç±»ä¸è¿è¡ã
è·¯å¾ä¸å å«åæ°ï¼è¿ç§æ åµéåä¸ä¼ éä¸ä¸ªä¸è½ä¸ºç©ºå¼çåæ°ãæ¯å¦æäºåºç¨ä¸ï¼æ¥è¯¢æ个ä¼ä¸çæ°æ®ï¼å¿ é¡»å å«ä¼ä¸çç¼å·ï¼å°±å¯ä»¥å¨å°åéæ¥æ¶è¿ä¸ªç¼å·ã
å¨ParamControllerä¸å¢å ä¸ä¸ªå½æ°PathParam
è·¯å¾ä¸çåæ°éè¿{ sn}æ¥æ¶å¼ã
使ç¨å称æ¥æ¶åæ°æ¯è¾ç´è§ï¼æç¨å¾æ¯è¾å¤ãä¸ç¨æ³¨è§£ãè·å®¢æ·ç«¯ä¼ çåæ°ååå°±å¯ä»¥æ¥æ¶å°ãå¦ä¸ä¾åä¸çreqParam
ä¹å¯ä»¥ç¨getä¼ å
ä¸é¢ç¨åæ°å称æ¥æ¶å¼ï¼åªè¦ä¸è¯·æ±æ¶çå称ä¸è´å°±è½æ¥æ¶å°åæ°å¼ãå¦æéè¦ä¼ éçåæ°æ¯è¾å¤çæ¶åï¼å°±ä¸éåä¸ä¸ªä¸ä¸ªåæ°åå¨å½æ°éäºï¼é£æ ·å¾ä¸æ¹ä¾¿ï¼ä¹å®¹æåºéãå¯ä»¥æè¿äºåæ°åå°ä¸ä¸ªå¯¹è±¡éæ¥æ¶ãå¦ä¸ä¾å
å建ä¸ä¸ªpackage:com.biboheart.demos.modelï¼å建ä¸ä¸ªç±»Person
ç¨Person对象æ¥æ¶åæ°
è½ç¶è¿æ ·çæ¹å¼ä¹è½æ¥æ¶getä¼ åï¼ä½æ¯å 为éè¦ä¼ çåæ°å¤äºï¼ç¨getæ¾å¾ä¸å¤ªæ¹ä¾¿ãè¿éå°±ä¸æµè¯GETæ¹å¼è¯·æ±äºã
æçæ¶åï¼éè¦æ¥æ¶JSONä¼ åãæ¯å¦æäºæå¡çè°ç¨éè¦å¼åä¸ä¸ªåè°å½æ°æ¥æ¶å¯¹æ¹çåè°å¹¶è·å¾åæ°å¼ä¸ºç»æï¼å¯¹æ¹åè°åæ¥çå¼æ¯JSONæ ¼å¼çå¼ï¼è¿æ¶åå°±éè¦æ¥æ¶JSONä¼ åæ°äºãç¨RequestBodyå¯ä»¥æ¥æ¶å°JSONä¼ å¼ã
éè¦JSON请æ±æè½æ£ç¡®æ¥å°å¼
SpringBootå®ä¾:å»é¢ç»ä¸ä¿¡æ¯å¹³å°(apigateway)
åé¢å·²ç»å¨å¹³å°ä¸ä½¿ç¨äºspringcloudãæ¯ä¸ªå°çæå¡ä¸åèªå®ç°ç¸å ³ä¸å¡ï¼æä¾APIãè¿äºæå¡ç访é®å°åé½å¯è½ä¸ä¸æ ·ãè¿æ ·ç»ä½¿ç¨é½é æå°æ°ï¼èä¸æå¡å¨æ¥å£ç®¡çä¹å¤æäºã
api-gatewayå°±æ¯æè¿äºapiéè¿ä¸ä¸ªæå¡æä¾åºå»ãå¨è¿ä¸ªæå¡ä¸ä»£çå ¶å®æå¡çAPIã对äºæå¡ç使ç¨é½å°±åæ¯è®¿é®ä¸å°æå¡å¨ã
è¿éç¨springzuulå®ç°api-gatewayã
å建ä¸ä¸ªé¡¹ç®ï¼æå¡ï¼ï¼ä¸é¨åapi代çãæå¡å称huip-routerã
pom
RouterApplication
为äºæ¯æè·¨åï¼å¢å ä¸ä¸ªFilter
é ç½®
å¨API请æ±å¼å¤´ä¸º/huipuser/æ¶è®¿é®çæ¯useræå¡çAPIï¼å¦æå¼å¤´/huippatient/æ¶è®¿é®çæ¯patientæå¡çAPIãæ¯å¦è¯·æ±ç¸å½äº
请æ±æµè¯ã
SpringBootå®ä¾:å»é¢ç»ä¸ä¿¡æ¯å¹³å°(æå¡é´é讯)ç访é®æµç¨æ¹æç¨ä»£çã
åºäºSpringBootçAPIæµè¯äºèç½äº§åçæµè¯çç¥ç°å¨å¾å¤é½ä¼åå¨APIæµè¯ãè½»é级GUIæµè¯ãè½»é级åå æµè¯çãAPIæµè¯å ¶å®æ们ä¸å¼å§æ³å¾æå¤çå¾å½¢åå·¥å ·åºè¯¥æ¯postmanãjmeterçãå¦æ使ç¨æç®åçgetæ¹æ³ï¼è¿å¯ä»¥ç´æ¥éè¿ä½¿ç¨CURLå½ä»¤ï¼å³å½ä»¤è¡å·¥å ·cURLï¼ã
ä¸ç®¡ä½¿ç¨ä»ä¹APIæµè¯å·¥å ·ï¼APIæµè¯çåºæ¬æ¥éª¤å¤§ä½ä¸è´ï¼
1.åå¤æµè¯æ°æ®
2.éè¿APIæµè¯å·¥å ·ï¼å起对被æµAPIçrequest
3.éªè¯è¿åç»æçresponse
æ们平æ¶å¨å·¥ä½ä¸ï¼æ¥è§¦å¾æå¤çæ¯ç¨JAVAæ¡æ¶Springbootæ¡æ¶å¼åçç®åçRestfulAPIã
Springboot建议çç®å½ç»æå¦ä¸ï¼rootpackageç»æ-com.example.myproject
ç§ç§äººå®¶ç¨SpringBootåçå端APIæ¥å£ï¼é£å«ä¸ä¸ªä¼éå设å®ç°ä¸ä¸ªæ³¨åç¨æ·çåè½ï¼å¨controllerå±ï¼ä»ä¼å è¿è¡æ ¡éªåæ°ï¼å¦ä¸ï¼
以ä¸ä»£ç æä»ä¹é®é¢åï¼å ¶å®æ²¡ä»ä¹é®é¢ï¼å°±æ¯æ ¡éªæç¹è¾£ç¼çãæ£å¸¸çæ·»å ç¨æ·ä¸å¡è¿æ²¡åï¼åæ°æ ¡éªå°±ä¸å¤§å å¦ãå设åæ¥ï¼åæ¥äºä¸ä¸ªéæ±ï¼ç¼è¾ç¨æ·ä¿¡æ¯ãå®ç°ç¼è¾ç¨æ·ä¿¡æ¯åï¼ä¹æ¯å æ ¡éªä¿¡æ¯ï¼å¦ä¸ï¼
æ们å¯ä»¥ä½¿ç¨æ³¨è§£çæ¹å¼ï¼æ¥è¿è¡åæ°æ ¡éªï¼è¿æ ·ä»£ç æ´å ç®æ´ï¼ä¹æ¹ä¾¿ç»ä¸ç®¡çãå®é ä¸ï¼springbootæ个validationçç»ä»¶ï¼æ们å¯ä»¥æ¿æ¥å³ç¨ãå¼å ¥è¿ä¸ªå å³å¯ï¼
å¼å ¥å åï¼åæ°æ ¡éªå°±é常ç®æ´å¦ï¼å¦ä¸ï¼
ç¶åå¨UserParamåæ°å¯¹è±¡ä¸ï¼å å ¥@Validated注解åï¼æé误信æ¯æ¥æ¶å°BindingResult对象ï¼ä»£ç å¦ä¸ï¼
å¦æä½ å¨ä½ 们项ç®ä»£ç ä¸ï¼çå°controllerå±æ¥æè¿åç»æï¼æè¿æ ·çï¼
ä¹æè¿æ ·çï¼
æ¾ç¶ï¼å¦ææ¥å£è¿åç»æä¸ç»ä¸ï¼å端å¤çå°±ä¸æ¹ä¾¿ï¼æ们代ç ä¹ä¸å¥½ç»´æ¤ãåæ¯å¦æç人å欢ç¨Resultå¤çç»æï¼æç¹äººå欢ç¨Responseå¤çç»æï¼å¯ä»¥æ³è±¡ä¸ä¸ï¼è¿äºä»£ç æå¤ä¹±ã
æ以ä½ä¸ºå端å¼åï¼æ们项ç®çååºç»æï¼éè¦ç»ä¸æ åçè¿åæ ¼å¼ãä¸è¬ä¸ä¸ªæ åçååºæ¥æ对象ï¼é½æåªäºå±æ§å¢ï¼
ååºç¶æç ä¸è¬ç¨æ举表示åï¼
å 为è¿åçæ°æ®ç±»åä¸æ¯ç¡®å®çï¼æ们å¯ä»¥ä½¿ç¨æ³åï¼å¦ä¸ï¼
æäºç»ä¸çååºä½ï¼æ们就å¯ä»¥ä¼åä¸ä¸controllerå±ç代ç å¦ï¼
æ¥å¸¸å¼åä¸ï¼æ们ä¸è¬é½æ¯èªå®ä¹ç»ä¸çå¼å¸¸ç±»ï¼å¦ä¸ï¼
å¨controllerå±ï¼å¾å¯è½ä¼æ类似代ç ï¼
è¿å代ç ï¼æ²¡ä»ä¹é®é¢åï¼ä½æ¯å¦ætry...catch太å¤ï¼ä¸æ¯å¾ä¼é ã
å¯ä»¥åå©æ³¨è§£@RestControllerAdviceï¼è®©ä»£ç æ´ä¼é ã@RestControllerAdviceæ¯ä¸ä¸ªåºç¨äºControllerå±çåé¢æ³¨è§£ï¼å®ä¸è¬é å@ExceptionHandler注解ä¸èµ·ä½¿ç¨ï¼ä½ä¸ºé¡¹ç®çå ¨å±å¼å¸¸å¤çãæ们æ¥çä¸demo代ç åã
è¿æ¯åæ¥çUserControllerï¼åä¸ä¸ªä¼æåºå¼å¸¸çuserServiceçæ¹æ³ï¼å¦ä¸ï¼
æ们åå®ä¹ä¸ä¸ªå ¨å±å¼å¸¸å¤çå¨ï¼ç¨@RestControllerAdvice注解ï¼å¦ä¸ï¼
æ们ææ³è¦æ¦æªçå¼å¸¸ç±»åï¼æ¯å¦æ³æ¦æªBizExceptionç±»åï¼å°±æ°å¢ä¸ä¸ªæ¹æ³ï¼ä½¿ç¨@ExceptionHandler注解修饰ï¼å¦ä¸ï¼
SpringBoot2åºäºSwagger2çæ离线Apiææ¡£Github:
Gitee:
个人è§å¾æ§ççé ç½®ç®å许å¤ï¼æ°ççé ç½®æç §å®æ¹demoçé ç½®æ¥åè¿æ¯å¤æäºå¾å¤
é ç½®å°Springboot项ç®ä¸ä»¥åï¼å¨é¡¹ç®æå çæ¶å便ä¼éè¿åå æµè¯å¨æå®çç®å½çæ被å®æ¹ç§°ä¸ºstaticdocsç离线ææ¡£
该ç¯åæå¼ç¨çä¾èµé½è¦å¼å ¥ï¼SpringRestDocsçä¾èµspring-restdocs-mockmvcï¼ç¦»çº¿ææ¡£çä¾èµspringfox-staticdocsï¼å 为è¦å¨åå æµè¯çæ¶åçæææ¡£ï¼æ以éè¦åå æµè¯ç¸å ³çspring-boot-starter-testã
asciidoctor-maven-pluginæ件ä¼æAsciidocæ ¼å¼æ件转æHTML5æ ¼å¼è¾åºã
è¿ä¸ªç±»å å«ä¸¤ä¸ªæ¹æ³ï¼TestApi()æ¯ç¨æ¥çæä¾åï¼test()ç¨æ¥çæAsciidocçææ¡£ãçæä¾åç¨å°äºspring-restdocs-mockmvcï¼æ¯ä¸ä¸ªAPIé½è¦è¿è¡åå æµè¯æè½çæç¸åºçææ¡£ç段ï¼snippetsï¼ï¼çæçç»æå¦å¾ï¼
çæå®æ´çAsciidocææ¡£ç¨å°äºSwagger2MarkupConverterï¼ç¬¬ä¸æ¥å è·åå¨çº¿çæ¬çæ档并ä¿åå°æ件swagger.jsonä¸ï¼ç¬¬äºæ¥æswagger.jsonåä¹åçä¾åsnippetsæ´å并ä¿å为Asciidocæ ¼å¼çå®æ´ææ¡£ãçæç»æå¦å¾ï¼
éè¿é 置类å®ä¹ä¸äºææ¡£ç¸å ³çä¿¡æ¯
è·¯å¾ï¼é¡¹ç®å/docs/asciidoc/index.adoc
å©ç¨åé¢é ç½®çmavenæ件ï¼åªéè¦æ§è¡æå å°±å¯ä»¥çæç¸åºçææ¡£ï¼å¦å¾ï¼
该ç¯åæå¼ç¨çä¾èµé½è¦å¼å ¥ï¼SpringRestDocsçä¾èµspring-restdocs-mockmvcï¼ç¦»çº¿ææ¡£çä¾èµspringfox-staticdocsï¼å 为è¦å¨åå æµè¯çæ¶åçæææ¡£ï¼æ以éè¦åå æµè¯ç¸å ³çspring-boot-starter-testã
asciidoctor-maven-pluginæ件ä¼æAsciidocæ ¼å¼æ件转æHTML5æ ¼å¼è¾åºã
è¿ä¸ªç±»å å«ä¸¤ä¸ªæ¹æ³ï¼TestApi()æ¯ç¨æ¥çæä¾åï¼createSpringfoxSwaggerJson()ç¨æ¥çæAsciidocçææ¡£ãçæä¾åç¨å°äºspring-restdocs-mockmvcï¼æ¯ä¸ä¸ªAPIé½è¦è¿è¡åå æµè¯æè½çæç¸åºçææ¡£ç段ï¼snippetsï¼ï¼çæçç»æå¦å¾ï¼
çæå®æ´çAsciidocææ¡£ç¨å°äºSwagger2MarkupConverterï¼ç¬¬ä¸æ¥å è·åå¨çº¿çæ¬çæ档并ä¿åå°æ件swagger.jsonä¸ï¼ç¬¬äºæ¥æswagger.jsonåä¹åçä¾åsnippetsæ´å并ä¿å为Asciidocæ ¼å¼çå®æ´ææ¡£ãçæç»æå¦å¾ï¼
éè¿é 置类å®ä¹ä¸äºææ¡£ç¸å ³çä¿¡æ¯
å¨resourcesç®å½ä¸å建ä¸ä¸ªå为logback.xmlçé ç½®æ件ï¼ä½¿ç¨LogstashEncoderä½ä¸ºDefaultLogEncoder
è·¯å¾ï¼é¡¹ç®åsrc/docs/asciidoc/index.adoc
å©ç¨åé¢é ç½®çmavenæ件ï¼åªéè¦æ§è¡æå å°±å¯ä»¥çæç¸åºçææ¡£ï¼å¦å¾ï¼