澶у濂斤紝鎴戜滑鍙堣闈簡銆傚綋浣跨敤JAVA杩涜鍓嶅悗绔垎绂荤殑椤圭洰寮€鍙戞椂锛屾湇鍔$闇€瑕佹彁渚涙帴鍙f枃妗d緵澶栧洿浜哄憳杩涜鎺ュ彛寮曞銆傝秺鏉ヨ秺澶氱殑椤圭洰姝e湪灏濊瘯浣跨敤涓€浜涘伐鍏凤紝鏍规嵁浠g爜鑷姩鐢熸垚鎺ュ彛鏂囨。锛岃€屼笉鏄紑鍙戜汉鍛樻墜鍔ㄧ紪鍐欐帴鍙f枃妗c€係wagger浣滀负涓€娆句紭绉€鐨勫湪绾跨晫闈㈡枃妗g敓鎴愬伐鍏凤紝浠ュ叾寮哄ぇ鐨勫姛鑳藉拰鏂逛究鐨勯泦鎴愯€岃憲绉般€傚凡琚箍娉涗娇鐢ㄣ€傞」鐩腑鏈変竴涓緢甯歌鐨勫満鏅紝灏辨槸鎺ュ彛鐨勮姹傛垨鍝嶅簲鍙傛暟涓煇浜涘瓧娈电殑鍙栧€间細琚檺瀹氫负鍑犱釜鍥哄畾鍙€夊€间腑鐨勪竴涓紝鑰屼唬鐮佷腑杩欎簺鍙€夊€煎父瀹氫箟涓轰緥濡傛牴鎹搷浣滅被鍨嬶紝杩囨护瀵瑰簲绫诲瀷鐨勭敤鎴锋搷浣滄棩蹇楀垪琛紝濡傦細http://127.0.0.1:8088/test/qu...浼犲叆鐨勫€艰姹傚弬鏁皁perateType闇€瑕佸湪鍚庣绾﹀畾鐨勫彇鍊艰寖鍥村唴锛屽彇鍊艰寖鍥村畾涔夊涓嬶細@Getter@AllArgsConstructorpublicenumOperateType{ADD(1,"娣诲姞鎴栧垱寤烘搷浣?),MODIFY(2,"鏇存柊宸叉湁鏁版嵁operation"),DELETE(3,"鍒犻櫎鏁版嵁鎿嶄綔"),QUERY(4,"鏌ヨ鏁版嵁鎿嶄綔");绉佹湁鏁存暟鍊硷紱privateStringdesc;}杩欓噷闇€瑕佸姞涓妎perateType鐨勫彲閫夊€硷紝骞跺姣忎釜鍙€夊€煎搴旂殑鍚箟淇℃伅杩涜娓呮鐨勮В閲婏紝璁╄皟鐢ㄨ€呯煡閬撳湪浣跨敤鐨勬椂鍊欏簲璇ヤ紶鍏ヤ粈涔堝€笺€傚綋鎴戜滑鍩轰簬Swagger鎻愪緵鐨勫熀鏈敞瑙h兘鍔涘疄鐜版椂锛屾垜浠細姣旇緝甯歌鐨勭湅鍒颁互涓嬩袱绉嶅啓娉曪細鍐欐硶涓€锛氬畾涔夋帴鍙f椂锛屾寚瀹氬叆鍙傜殑鍊硷紝琛ㄧず鎺ュ彛鎼哄甫鐨勮姹傝緭鍏ヤ俊鎭疷RL锛岄€氳繃@ApiImplicitParam娉ㄨВ鍛婅瘔璋冪敤鑰呰繖涓帴鍙e厑璁告帴鏀剁殑鍚堟硶operateType鐨勫彇鍊艰寖鍥村拰姣忎釜鍊肩殑鍚箟銆備緥濡備笅闈㈢殑鍦烘櫙锛欯GetMapping("/queryOperateLogs")@ApiOperation("鏌ヨ鎸囧畾鎿嶄綔绫诲瀷鐨勬搷浣滄棩蹇楀垪琛?)@ApiImplicitParam(name="operateType",value="鎿嶄綔绫诲瀷锛屽€艰鏄庯細1,newIncrement;2,Update;3,Divide;4,Query",dataType="int",paramType="query")publicListqueryOperateLogs(intoperateType){returntestService.queryOperateLogs(operateType);}涓繖鏍凤紝鍦╯wagger鐣岄潰涓婂氨鍙互鏄剧ず璇ュ瓧娈电殑鍊兼弿杩颁俊鎭簡銆傚叾瀹炶繕鏈夊彟澶栦竴绉嶅啓娉曪紝灏辨槸鍦ㄤ唬鐮佺殑鍏ュ弬鍓嶅姞涓夽ApiParam娉ㄨВ鏉ュ疄鐜般€備緥濡傦細@GetMapping("/queryOperateLogs")@ApiOperation("鏌ヨ鎸囧畾鎿嶄綔绫诲瀷鐨勬搷浣滄棩蹇楀垪琛?)publicListqueryOperateLogs(@ApiParam(value="鎿嶄綔绫诲瀷锛屽彇鍊艰鏄庯細1锛宯ew;2銆佹洿鏂帮紱3銆佸垹闄わ紱4銆佹煡璇?)@RequestParam("type")intoperateType){returntestService.queryOperateLogs(operateType);}杩欐牱涔熷彲浠ヨ揪鍒板悓鏍风殑鏁堟灉銆傚啓娉曚簩锛氳姹傛垨鍝嶅簲body涓В閲婂瓧娈电殑鍊兼弿杩般€傚浜庨渶瑕佷娇鐢╦sonbody浼犺緭鐨勮姹傛垨鍝嶅簲娑堟伅浣揗odel锛屽彲浠ヤ娇鐢ˊApiModelProperty娣诲姞鍚箟璇存槑銆侤Data@ApiModel("鎿嶄綔璁板綍淇℃伅")publicclassOperateLog{@ApiModelProperty("鎿嶄綔绫诲瀷锛屽彇鍊艰鏄庯細1銆佸鍔狅紱2銆佹洿鏂帮紱3銆佸垹闄わ紱4銆佹煡璇?)privateintoperateType;@ApiModelProperty("鎿嶄綔鐢ㄦ埛")privateString鐢ㄦ埛锛汙ApiModelProperty("OperationDetails")privateStringdetail;}鍚屾牱鍙互娓呮鐨勭煡閬揝wagger鎺ュ彛涓婂悇涓瓧娈电殑鍏蜂綋鍚箟鍜屽彇鍊艰鏄庛€備絾鏄笂闈袱绉嶅啓娉曢兘鏈変竴涓棶棰橈紝灏辨槸濡傛灉鏋氫妇绫讳腑鐨勫€煎唴瀹圭殑鍚箟鍙戠敓鍙樺寲锛屾瘮濡傚湪OperateType鏋氫妇绫讳腑澧炲姞浜嗕竴涓猲ewBATCH_DELETE(5,"batchdelete")锛屼綘蹇呴』鎵嬪姩淇敼鎵€鏈夋秹鍙婃帴鍙d笂鐨凷wagger鎻忚堪淇℃伅銆傚鏋滆繖涓瓧娈垫秹鍙婂埌鐨勫満鏅瘮杈冨锛岄渶瑕佹敼鐨勫湴鏂瑰緢澶氾紝寰堝鏄撻仐婕忥紙鍥犱负鐩存帴閫氳繃浠g爜鍏宠仈鍏崇郴鏌ユ壘涓嶅ソ锛夈€傝繖鏍蜂竴鏉ワ紝寮€鍙戜汉鍛樼殑缁存姢鎴愭湰灏变細澧炲姞锛屼箙鑰屼箙涔嬶紝鎺ュ彛鏂囨。鐨勫唴瀹瑰氨浼氫笌瀹為檯鐨勪唬鐮佸鐞嗕笉鍖归厤銆傞偅涔堬紝鏈変粈涔堢畝鍗曠殑鏂规硶鍙互璁╂帴鍙f枃妗f牴鎹搴旀灇涓剧被鐨勫唴瀹硅嚜鍔ㄥ姩鎬佸彉鍖栧憿锛烻wagger骞舵病鏈夊師鐢熸敮鎸佽繖涓兘鍔涳紝浣嗘槸鎴戜滑鍙互閫氳繃涓€浜涚畝鍗曠殑鏂瑰紡鎵╁睍Swagger鐨勮兘鍔涳紝璁㏒wagger鏀寔鎴戜滑鐨勯渶姹傘€傝鎴戜滑鏉ョ湅鐪嬪浣曞疄鐜板畠銆傛墿灞曞彲琛屾€у垎鏋愭棦鐒惰鍦ㄧ敓鎴愮殑Swagger鏂囨。涓洿鏀规寚瀹氬瓧娈电殑鎻忚堪鍐呭锛岄偅涔堥鍏堣寮勬竻妤歋wagger涓綋鍓嶇殑鍐呭鐢熸垚閫昏緫鏄浣曞鐞嗙殑銆傛垜浠互@ApiParam涓轰緥杩涜鍒嗘瀽銆傚洜涓篅ApiParam涓寚瀹氱殑鍐呭浼氭樉绀哄湪Swagger鐣岄潰涓婏紝鎵€浠wagger妗嗘灦涓偗瀹氭湁涓€涓湴鏂逛細灏濊瘯鑾峰彇杩欎釜娉ㄨВ涓寚瀹氱殑鐩稿叧瀛楁鍊硷紝鐒跺悗杞崲娉ㄨВ鐨勫唴瀹硅繘鍏ョ晫闈㈠唴瀹圭殑鏂囦欢銆傛墍浠ユ兂瑕佸畾鍒讹紝棣栧厛瑕佷簡瑙e畠鐩墠鏄浣曞鐞嗙殑銆傛煡鐪婼wagger鐨勬簮鐮侊紝鍙戠幇杩欓儴鍒嗛€昏緫鏄湪ApiParamParameterBuilder绫讳腑澶勭悊鐨勩€傚鐞嗛€昏緫濡備笅锛氳鍙栬繖涓被鍚庯紝灏辨槸ParameterBuilderPlugin鎺ュ彛鐨勪竴涓疄鐜扮被銆傞€愪竴閬嶅巻鐢熸垚鍙傛暟鎻忚堪淇℃伅鏃朵細璋冪敤Swagger妗嗘灦銆傝繖瀹炵幇浜嗚鎵ц鐨勭被鐨勯€昏緫銆傝嚦姝わ紝闂灏卞凡缁忓緢鏄庢樉浜嗐€傛垜浠彲浠ヨ嚜瀹氫箟涓€涓鐞嗙被锛屽疄鐜癙arameterBuilderPlugin鎺ュ彛锛岀劧鍚庡湪鑷畾涔夊鐞嗙被涓疄鐜版垜浠殑闇€姹傘€傞毦閬撲笉鑳藉疄鐜版垜浠殑璇夋眰鍚楋紵鍚屾牱鐨勭瓥鐣ワ紝鎴戜滑鍙互鎵惧埌@ApiImplicitParam鍜孈ApiModelProperty瀵瑰簲鐨勬帴鍙g被銆傛牴鎹笂闈㈢殑鍒嗘瀽锛屾垜浠彧闇€瑕佹彁渚涗竴涓嚜瀹氫箟鐨勫疄鐜扮被锛岀劧鍚庡垎鍒疄鐜拌繖浜涙帴鍙e氨鍙互婊¤冻鎴戜滑鐨勯渶姹備簡銆傞偅涔堜綔涓哄叏鍦烘櫙鐨勯€氱敤鑳藉姏搴旇濡備綍灏佽鍜屼娇鐢ㄥ憿锛熻鎴戜滑鍦ㄤ笅闈㈣缁嗚璁哄畠銆傚熀浜庢灇涓剧被鐢熸垚鎻忚堪鐨勮嚜瀹氫箟娉ㄨВ瀹炵幇鎴戜滑宸茬粡鎵惧埌浜嗗皢鎴戜滑鑷畾涔夌殑閫昏緫娉ㄥ叆鍒癝wagger鐨勬枃妗g敓鎴愭鏋朵腑杩涜璋冪敤鐨勬柟娉曪紝鎵€浠ヤ笅涓€姝ユ垜浠纭涓€涓瘮杈冪畝鍗曠殑绛栫暐锛屽憡璇夋鏋跺摢浜汧ield闇€瑕佷娇鐢ㄦ灇涓捐嚜鍔ㄧ敓鎴愬€兼弿杩帮紝浠ュ強浣跨敤鍝釜鏋氫妇绫绘潵鐢熸垚瀹冧滑銆傝繖閲屾垜浠娇鐢ㄨ嚜瀹氫箟娉ㄨВ鏉ュ疄鐜般€係wagger閽堝涓嶅悓鐨勫満鏅彁渚涗簡@APIParam銆丂ApiImplicitParam銆丂ApiModelProperty绛変笉鍚岀殑娉ㄨВ銆傛垜浠彲浠ュ鍏惰繘琛岀畝鍖栵紝鎻愪緵缁熶竴鐨勮嚜瀹氫箟娉ㄨВ銆備緥濡傦細@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)public@interfaceApiPropertyReference{//鎺ュ彛鏂囨。涓婃樉绀虹殑瀛楁鍚嶏紝濡傛灉娌℃湁璁剧疆锛屽垯浣跨敤鍘熸潵鐨勫瓧娈靛悕绉癝tringname()default"";//瀛楁绠€瑕佽鏄庯紝optionalStringvalue()default"";//鏍囪瘑瀛楁鏄惁蹇呭~booleanrequired()defaultfalse;//鎸囧畾鍊煎搴旂殑鏋氫妇绫籆lassreferenceClazz();}杩欐牱锛屽浜庨渶瑕佹坊鍔犲€兼弿杩扮殑瀛楁鎴栨帴鍙o紝鎴戜滑鍙互娣诲姞@ApiPropertyReference锛屽苟鎸囧畾瀵瑰簲鐨勬灇涓剧被銆備緥濡傚涓嬶細@Data@ApiModel("鎿嶄綔璁板綍淇℃伅")publicclassOperateLog{@ApiPropertyReference(value="鎿嶄綔绫诲瀷",referenceClazz=OperateType.class)privateintoperateType;//...}鍦ㄤ笂闈㈢殑绀轰緥浠g爜涓紝OperateType鏄竴涓凡缁忓畾涔夊ソ鐨勬灇涓剧被銆傜幇鍦ㄦ垜浠亣鍒颁簡鍙︿竴涓棶棰樸€傛灇涓剧被鐨勫疄鐜板舰寮忓叾瀹炴槸涓嶄竴鏍风殑銆傛€庢牱鎵嶈兘璁╂垜浠殑鍐呭鑷姩鐢熸垚鏈嶅姟鐭ラ亾鑾峰彇鏋氫妇绫讳腑鐨勫摢浜涘唴瀹硅繘琛屽鐞嗗憿锛熷綋鐒讹紝鎴戜滑鍙互鍚屾剰Swagger娉ㄨВ涓娇鐢ㄧ殑鏋氫妇绫诲繀椤婚伒寰浐瀹氱殑鏍煎紡锛屼絾鏄樉鐒跺疄鐜伴毦搴︿細澧炲姞锛岃繖涓嶆槸鎴戜滑鎯宠鐨勭粨鏋溿€傚厛鐪嬩笅闈㈢粰鍑虹殑鏋氫妇绫伙紝瀹冨寘鍚笁涓睘鎬у€紀rder銆乿alue銆乨esc锛屽叾涓璿alue瀛楁灏辨槸鎴戜滑鎺ュ彛瀛楁闇€瑕佷紶鍏ョ殑瀹為檯鍊硷紝desc灏辨槸瀹冨搴旂殑鍚箟鎻忚堪锛岄偅涔堝浣曡鎴戜滑鑷畾涔塖wagger鎵╁睍绫荤煡閬撳簲璇ヤ娇鐢╲alue鍜宒esc瀛楁鏉ョ敓鎴愭枃妗f弿杩板唴瀹瑰憿锛烜Getter@AllArgsConstructorpublicenumOperateType{ADD(1,11,"娣诲姞"),MODIFY(2,22,"鏇存柊"),DELETE(3,33,"鍒犻櫎");绉佷汉璁㈠崟锛涚鏈夋暣鏁板€硷紱privateStringdesc;}绛旀骞朵笉闄岀敓锛岃繕鏄嚜瀹氫箟娉ㄨВ锛佸彧闇€瑕佹彁渚涗竴涓嚜瀹氫箟娉ㄨВ锛岀劧鍚庢坊鍔犲埌鏋氫妇绫讳腑锛屾寚瀹氭灇涓剧被涓殑鍝釜瀛楁浣滀负value鍊硷紝鐢ㄥ摢涓瓧娈垫潵鎻忚堪desc瀛楁鍊笺€侤Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public@interfaceSwaggerDisplayEnum{Stringvalue()榛樿鈥滃€尖€濓紱Stringdesc()default"desc";}杩欐牱锛屽湪鏋氫妇绫籗waggerDisplayEnum涓婂姞涓夽锛屾寚瀹氫笅涓€涓瓧娈电殑鏄犲皠锛屽彲浠ュ湪Swagger娉ㄨВ涓娇鐢細杩欓噷鏄垜浠渶瑕佺殑鏁版嵁鏉ユ簮鍜屽€艰浆鎹㈣鍒欓兘宸茬粡纭畾浜嗭紝鍓╀笅鐨勫氨鏄浣曞皢涓€涓灇涓剧被涓渶瑕佺殑鍙栧€煎拰鎻忚堪鐨勫瓧娈垫嫾鎺ユ垚鎯宠鐨勫唴瀹逛簡銆傚洜涓烘槸閫氱敤鑳藉姏锛屾墍浠ヨ繖閲岄渶瑕侀€氳繃鍙嶅皠鏉ュ疄鐜帮細privateStringgenerateValueDesc(ApiPropertyReferencepropertyReference){ClassrawPrimaryType=propertyReference.referenceClazz();SwaggerDisplayEnumswaggerDisplayEnum=AnnotationUtils.findAnnotation(rawPrimaryType,SwaggerDisplayEnum);StringenumFullDesc=Arrays.stream(rawPrimaryType.getEnumConstants()).filter(Objects::nonNull).map(enumConsts->{ObjectfieldValue=ReflectUtil.getFieldValue(enumConsts,swaggerDisplayEnum.value());ObjectfieldDesc=ReflectUtil.getFieldValue(enumConsts,swaggerDisplayEnum.desc());returnfieldValue+":"+fieldDesc;}).collect(Collectors.joining(";"));returnpropertyReference.value()+"("+enumFullDesc+")";}娴嬭瘯涓嬭緭鍑哄涓嬫牸寮忥紝鑷姩鏄剧ず鏋氫妇绫讳腑鐨勬墍鏈夋灇涓惧€煎強鍏舵弿杩颁俊鎭€傦紙1锛氭坊鍔狅紱2锛氭洿鏂帮紱3锛氬垹闄わ級鑷畾涔夋墿灞曞鐞嗗櫒鐨勫疄鐜拌嚦姝わ紝鎴戜滑宸茬粡鍋氬ソ浜嗘墍鏈夌殑鍑嗗宸ヤ綔銆傛帴涓嬫潵锛屾垜浠彲浠ュ畾涔変竴涓疄鐜扮被鏉ュ疄鐜扮浉鍏崇殑Interface锛屽皢鎴戜滑鐨勫鐞嗚浆鎹㈤€昏緫娉ㄥ叆鍒癝wagger妗嗘灦涓€侤Component@PrimarypublicclassSwaggerEnumBuilderPluginimplementsModelPropertyBuilderPlugin,ParameterBuilderPlugin{@Overridepublicvoidapply(ModelPropertyContextcontext){//Model涓璮ield瀛楁鎻忚堪鐨勮嚜瀹氫箟澶勭悊绛栫暐}@Overridepublicvoidapply(ParameterContextparameterContext){//API鑷畾涔変腑鐨勫弬鏁板鐞嗙瓥鐣@Overridepublicbooleansupports(DocumentationTypedelimiter){returntrue;鎺ヤ笅鏉ワ紝鎴戜滑鍙渶瑕佸湪apply鏂规硶涓姞鍏ユ垜浠嚜瀹氫箟鐨勫鐞嗛€昏緫鍗冲彲銆侫PI杈撳叆鍙傛暟鍊艰嚜鍔ㄧ敓鎴愯鏄庢垜浠凡缁忚杩囧浣曞皢鎸囧畾鏋氫妇绫讳腑鐨勬灇涓惧€肩敓鎴愪负鎻忚堪瀛楃涓层€傝繖閲屾垜浠洿鎺ヨ皟鐢ㄥ畠锛岀劧鍚庡皢缁撴灉璁剧疆鍒颁笂涓嬫枃涓€侤Overridepublicvoidapply(ParameterContextcontext){ApiPropertyReferencereference=context.getOperationContext().findAnnotation(ApiPropertyReference.class).orNull();Stringdesc=generateValueDesc(鍙傝€?;濡傛灉(StringUtils.isNotEmpty(reference.name())){context.parameterBuilder().name(reference.name());}context.parameterBuilder().description(desc);AllowableListValuesallowableListValues=getAllowValues(reference);context.parameterBuilder().allowableValues(allowableListValues);}鑷姩鐢熸垚Model涓瓧娈电殑鍊硷紝瑙i噴鍚岀悊銆傛垜浠潵澶勭悊鏁版嵁瀹炰綋绫讳腑瀛楁瀵瑰簲鐨勫惈涔夌殑鎻忚堪銆侤Overridepublicvoidapply(ModelPropertyContextmodelPropertyContext){if(!modelPropertyContext.getBeanPropertyDefinition().isPresent()){杩斿洖锛泒BeanPropertyDefinitionbeanPropertyDefinition=modelPropertyContext.getBeanPropertyDefinition().get();//鐢熸垚闇€瑕佹嫾鎺ョ殑鍊兼弿杩板唴瀹筍tringvalueDesc=generateValueDesc(beanPropertyDefinition);modelPropertyContext.getBuilder().description(valueDesc).type(modelPropertyContext.getResolver().resolve(beanPropertyDefinition.getField().getRawType()));}}鏁堟灉婕旂ず鍒拌繖閲岋紝浠g爜灞傜骇澶勭悊鍏ㄩ儴瀹屾垚銆傛帴涓嬫潵杩愯绋嬪簭锛岀湅鐪嬫晥鏋溿€傚厛鐪婣PI鎺ュ彛涓緭鍏ュ弬鏁板惈涔夌殑鎻忚堪鏁堟灉锛氫粠鎺ュ彛鏁堟灉鍙互鐪嬪嚭锛屼笉浠呰嚜鍔ㄦ樉绀轰簡鍊肩殑鎻忚堪锛岃€屼笖鍦ㄦ帴鍙h皟璇曠殑鏃跺€欙紝杈撳叆box涔熷彉鎴愪簡涓嬫媺妗嗭紙鍥犱负鎴戜滑鑷姩璁剧疆浜哸llowableValues灞炴€э級锛屽彧鑳借緭鍏ュ厑璁哥殑鍊笺€傚悓鏍风殑锛屾垜浠湅涓€涓婱odel涓瓧娈电殑鎻忚堪鏁堟灉锛氬彲浠ョ湅鍒版帴鍙f枃妗d腑鐨勫弬鏁版弿杩颁俊鎭凡缁忚嚜鍔ㄦ惡甯︿簡鏋氫妇绫讳腑瀹氫箟鐨勫€欓€夊€煎唴瀹瑰拰鎻忚堪銆傛垜浠彧淇敼鏋氫妇绫讳腑鐨勫唴瀹癸紝鍏朵粬涓嶅彉銆傚啀鐪嬬晫闈紝鍙戠幇Swagger鐣岄潰涓殑鎻忚堪鍐呭宸茬粡鍚屾鏇存柊涓烘渶鏂板唴瀹广€傚畬缇庯紝浣犲畬鎴愪簡馃挴馃挴馃挴銆傜患涓婃墍杩帮紝缁欏ぇ瀹跺垎浜笅濡備綍閫氳繃鑷畾涔夋敞瑙f墿灞昐wagger鐨勮兘鍔涳紝浣縎wagger鏀寔浠庢寚瀹氱殑鏋氫妇绫昏嚜鍔ㄧ敓鎴愭帴鍙f枃妗d腑鐨勫瓧娈垫弿杩扮殑瀹炵幇鎬濊矾銆傛偍瀵规湰鏂囩殑鍐呭鏈変粈涔堟兂娉曟垨鐙埌鐨勮瑙e悧锛熸杩庡湪璇勮鍖轰竴璧蜂氦娴佽璁恒€傪煋p煋e湪杩欓噷鍐欎簡涓ゅ彞闀跨瘒澶ц锛岀獊鐒跺彂鐜癝wagger鍏跺疄寰堝ソ鐢紝浣嗘槸鎯宠鐢ㄥソ杩樻槸瑕佷笅涓€鐣姛澶殑锛屾墍浠ュ喅瀹氬崟鐙啓涓€绡囨枃妗o紝浠嬬粛濡備綍鍦ㄩ」鐩腑鐪熸浣跨敤Swagger锛岃繖灏嗗湪涓嶄箙鐨勫皢鏉ュ垎浜€傛劅鍏磋叮鐨勬湅鍙嬪彲浠ョ暀鎰忎竴涓嬶紝浠ュ厤杩疯矾銆傪煒侌煒侌煒佸叧浜庢湰鏂囨秹鍙婂埌鐨刣emo浠g爜鐨勫畬鏁寸ず渚嬶紝鎴戝凡缁忔暣鐞嗗ソ鎻愪氦鍒癵ithub涓婁簡銆傞渶瑕佺殑鍙互鑷繁鑾峰彇锛歨ttps://github.com/veezean/JavaBasicSkills鎴戞槸鍚挋锛岃鐨勬槸鎶€鏈紝涓嶅彧鏄妧鏈瘇濡傛灉瑙夊緱鏈夌敤锛岃鐐硅禐+鍏虫敞璁╂垜鎰熷彈涓€涓嬩綘鐨勬敮鎸併€備篃鍙互鍏虫敞鎴戠殑鍏紬鍙枫€愭灦鏋勫惎钂欍€戯紝鏇存柊鏇村強鏃躲€傛湡寰呬笌鎮ㄦ帰璁紝鍏卞悓鎴愰暱涓烘洿濂界殑鑷繁銆?/p>