




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
技術(shù)儲 REST風(fēng)格的前端與交 注解 注解基本概 平臺提供的注 常用Spring注 其它技術(shù)儲 框架概 概 運行機(jī) 與前端展現(xiàn)框架的關(guān) REST風(fēng)格服務(wù)調(diào) 面向服務(wù)的服務(wù)調(diào) 開 控制層(交互層 服務(wù)交互-面向資源(通過REST請求操作資源 持久 功能組件-工具 概 基本使 異常定 REST網(wǎng)絡(luò)上的所有事物都被抽象為資源(resource每個資源對應(yīng)一個唯一的資源標(biāo)識(resourceidentifier對資源的不會改變資源標(biāo)識所有的操作都是無狀態(tài)的 essGET0001userPOST,Annotation(JDK5.0class,}{{}@ColumnRequestParam類名demo.views.MainView=function(){varme=$extend(mx.views.View);varbase={};base.init=me.init;varhsplit=null;vartoolbar=null;vargrid=null;me.init=function(){functionhsplit=newmx.containers.HSplit({rows:"26px,*"toolbar=newmx.controls.ToolBar({width:"100%",name"addtext添加imageUrlname"edittext編輯imageUrlname"deletetext刪除imageUrlonitemclick:grid=newmx.d entityContainer:new baseUrl:Constant.gatewayURL+"/",primaryKey:"id",loadMeta: ging:true,allowSorting:true,allowEditing:false, yCheckBox:true,columns:{name:"id",caption:"ID",align:"center",allowSorting:true,dataType:"string"},{name:"productModel",caption:" ",align:"center",width:"100px",allowSorting:true,dataType:"string"},{name:"productName",caption:"產(chǎn)品名稱",align:"centerwidth"100pxallowSorting:truedataTypestringname"partDrawingNumbercaption零件圖號",align:"center",width:"100px",allowSorting:true,dataType:"string"}hsplit.addControl(grid,1);}publicWrappedResultgetMetaData(@ColumnRequestParam("params")String[]columns){List<ViewAttributeData>datas=datas=ViewAttributeUtils.getViewAttributes(columns,WrappedResultwrappedResult=.successWrapedResult(newreturn}catch(Exceptione){logger.error(e.getMessage(),e);return}@QueryRequestParam類名GETurlKEYQueryRequestParam("params")url":"id,name,age,"}}轉(zhuǎn)換為Reqondition對象。如果是查詢的子表的信息,需要傳入parentID。例如:{"params":{"filte x"},"parentID":"xxxxxxx"}get。demo.views.MainView=function(){varme=$extend(mx.views.View);varbase={};base.init=me.init;varhsplit=null;vartoolbar=null;vargrid=null;me.init=function(){functionhsplit=newmx.containers.HSplit({rows:"26px,*"toolbar=newmx.controls.ToolBar({width:"100%",name"addtext添加imageUrlname"edittext編輯imageUrlname"deletetext刪除imageUrlonitemclick:grid=newmx.d entityContainer:new baseUrl:Constant.gatewayURL+"/",primaryKey:"id",loadMeta:alloging:true,allowSorting:true,allowEditing:false,disyCheckBox:true,columns:[{name:"id",caption:"ID",align:"center",allowSorting:true,dataType:"string"},{name:"productModel",caption:" ",align:"center",width:"100px",allowSorting:true,dataType:"string"},{name:"productName",caption:"產(chǎn)品名稱",align:"centerwidth"100pxallowSorting:truedataTypestringname"partDrawingNumbercaption零件圖號",align:"center",width:"100px",allowSorting:true,dataType:"string"}hsplit.addControl(grid,1);}publicWrappedResultquery(@QueryRequestParam("params")Reqonditionreqondition){tryQueryResultObjectqueryResult=return}catch(Exceptione){logger.error(e.getMessage(),e);return}}@ControllerHTTP URLURI 用于將數(shù)據(jù)層(DAO層)的類標(biāo)識為SpringBean。具體只需將該注解標(biāo)DAOSpring@RepositoryXMLBean XML<bean/>BeanSpringbase-packageclass文件,所有標(biāo)注了@Repository的類都將被為SpringBean。下面通過示例具體解釋 解的用法xtResourceLoaderourceSpring} } @ValidProductionproduction//@ValidProductionproduction//實體設(shè)置+類+類 直接將頁面?zhèn)鬟^來production對象中的信息封裝到里面去了@PathVariableLongid,//此處id對應(yīng)映射時傳遞過來的值}springbeanspringMVCspringIOC;了解html和jsp;J2EE了解hibernatepojo、掌握面向?qū)ο筮M(jìn)行持久化的中間件實現(xiàn)機(jī)制采用基于REST風(fēng)格的web服務(wù),是一種基于資源的服務(wù)架構(gòu),HTTPwebWeb,解,用于封裝前臺傳遞的數(shù)據(jù)和返回給前臺的數(shù)據(jù))進(jìn)行JSon調(diào)用形式。GET,appnamemodule模塊間rest調(diào)用安全控制:定義模塊調(diào)用的安全器。在器中解析調(diào)IPIP(可多條安全規(guī)則安全控制相關(guān)的配置放在perties說明:在perties中配置認(rèn)證規(guī)則配置interfaceName:methodName:returnType:調(diào)用方必須滿足配置的所有規(guī)則才可被接 每種規(guī)則之間用分隔IP提供WebService支持,將邏輯組件發(fā)布成WebService。前端WebService異構(gòu)系統(tǒng)發(fā)送的請求,提供用戶請求數(shù)據(jù)的格式化、傳輸、封包與解包,URLWeb(Resource每一個資源類和其資源實體都可以用一個URI地址來唯一標(biāo)識。如bdz(“ID“e80d3cf8(ResourceRequest請求中包含要的資源類、資源實體(可選)此每一個資源URI會對應(yīng)于一個HTTPURL,而資源請求中的方法正好對應(yīng)于HTTPHTTP在系統(tǒng)啟動的時候,掃描注解定義信息,保存于DefaultAnnotationHandlerMap中。DispatcherServlet這個請求之后,執(zhí)行g(shù)etHandler方法查找已經(jīng)的所有URL-處理器映射信息找到業(yè)務(wù)處理類。并組合配置的器,組成執(zhí)行鏈。DispatcherServlet調(diào)用執(zhí)行鏈器的前置方法如果某個方法返回false,DispatcherServlethandleAnnotationMethodHandlerAdapterDispatcherServlet調(diào)用執(zhí)行鏈器的后置方DispatcherServlet調(diào)用執(zhí)行鏈器的完成方DispatcherServletHTTP{}{}successfulfalse,resultHintspring}MyExceptionHTTP協(xié)議規(guī)定了瀏覽器 網(wǎng)服務(wù)器之間相互通信的規(guī)則前端通過在統(tǒng)一應(yīng)用開發(fā)平臺,使用注解的方式定義HTTP請求和資源處理組件之間的映射關(guān)系。其中@ControllerHTTP@RequestMap注解將特定的URL和具體的控制器類或控制類類中的方法綁定。URL }}求;②處的RequestMap注解定義了可以接收URI的地址為/forum.uap,這樣如果接收到一個URL為/forum.uap的HTTP請求時,就會交由ForumControllerlistAllBoardRequestMap的默認(rèn)屬性為value,②處的注解也可以寫@RequestMap("/forum")RequestMap注解的值支持ANT風(fēng)格的URI,其中有三種通配符定義?* }}如果在類級別和方法級別上同時標(biāo)注了RequestMap注解,兩者將URLlistAllBoardURI/forum/listURIREST從資源的角度來觀察整個網(wǎng)絡(luò),分布在各處的資源由URI確定,通常使用一個唯一標(biāo)識符來指定某個資源,例如 /transformer/beijing/sg。前端發(fā)出REST請求之后,需要獲取對資源的標(biāo)識。使用@PathVariable注解結(jié)合@RequestMap注解,在URI中定義模板變量的方式,獲取URI中的標(biāo)識符。 }}在上例中,②處RequestMap中注解值為/forum/{boardId}/{topicId},boardIdtopicId中,定義與模板變量同名的參數(shù),并添加@PathVariable注解,就可以通過方法URIHTTP在REST請求中,使用HTTP方法指定了對資源操作的動作 也應(yīng)該能 } }}根據(jù)HTTP方法,確定對資源的操作。RequestMap注解的method } }}通過對HTTPREST} 對于不同類型的前端,} }}例如在上邊的例子中,分別創(chuàng)建了真對大屏和筆記本兩種響應(yīng)方式,Accept } }}HTTP標(biāo)準(zhǔn)中,URI不僅有地址部分,還包括?后以 } }}例如在上邊的例子里,如果REST請求的URI的查詢字符串中包含order=month,將調(diào)用queryTopicByMonth方法,如果包含查詢字符串中order=author,queryTopicByAuthor寫成params={“key1=value1”,”key2=value2”}這種形式。通常使用自定義使用RequestParam注解,獲取HTTP請求中的參數(shù)信息,用法為@RequestParam("}}稱和對方法參數(shù)名稱相同,參數(shù)名稱可以省略。例如上邊就可以寫成平臺在啟動的時候,需要掃描上一個步驟所配置的注解信息,建立映射關(guān)系。這樣,當(dāng)接收到前端發(fā)送的REST請求的時候,可以根據(jù)映射關(guān)系,請求轉(zhuǎn)發(fā)到具體的業(yè)務(wù)組件和業(yè)務(wù)方法進(jìn)行處理。下面簡單介紹映射關(guān)系加載的步驟。HTTP對所有控制器類進(jìn)行遍歷,掃描類的映射配置信息,并保存到應(yīng)用緩存中。根據(jù)上個步驟映射信息的配置可以看到,URI類級別,也可以配置在方法級別,所以需要綜合進(jìn)行處理。根據(jù)控制器的類型,定義在類上的映射關(guān)系注解信URI遍歷類級別URI映射值和類中所有方法的URI映射值,組合類級URIPatternPattern,URI通過以上的步驟,平臺啟動時就完成了映射信息的和加載過程除了具體的業(yè)務(wù)處理,平臺需要在對請求處理之前進(jìn)行安全驗證、日志記錄,在請求處理之后進(jìn)行資源回收、日志記錄等必要性非業(yè)務(wù)工作??蚣苤卸x了一類稱之為器的對象,在器中可以定義前置方法和后置方法,通過配置的方式,在處理業(yè)務(wù)前后執(zhí)行 器中定義的方法。在上邊的步驟中,完成了對HTTP請求與組件之間映射關(guān)系的配置和讀取。當(dāng)接收到REST請求之后,就可以根據(jù)HTTP請求信息查找當(dāng)前加載的映射關(guān)系,找到處理當(dāng)前請求的控制器類,并組合控制器類和定義的器,組裝成為一個完整的執(zhí)行鏈。按照器的配置順序,順序執(zhí)行其中定義的前置方法。如果某一個前置方false,停止執(zhí)行鏈的進(jìn)行。按照器的配置順序,反序執(zhí)行其中定義的后置方瀏覽器向發(fā)送REST請求,根據(jù)請求內(nèi)容調(diào)用具體的業(yè)務(wù)方法后將業(yè)務(wù)方法的執(zhí)行結(jié)果裝配成為瀏覽器端能夠理解的格式并返回響應(yīng)。響應(yīng)信息應(yīng)該包括以下部分:請求結(jié)果,成功或者失敗,表示是否完成請求{successfultrue{successfultruefalse定}dataurlRequestcontrollercontrollerGET請求中從url中通過指定的key值將參數(shù)取出,用于查詢條件,如@QueryRequestParam("params")url中的params②Reqondition類為平臺自定義的一個類,作用就是對請求體中查詢Reqonditionfilter、分頁所③QueryResultObject類作用是將查詢結(jié)果進(jìn)行包裝,該類定義了查詢結(jié)果itemCountitems{"successful":true,"resultValue":{ "resultHint":{"successful":true,"resultValue":{ "resultHint":"errorPage":"type":}其中successful表示是否成功,resultValueresultHint,errorPage,type求,將員工信息當(dāng)作參數(shù)傳遞到后端,urlRequestcontrollerjsonQueryResultObject的setFormItems(data)方法來設(shè)置查詢結(jié)果集合WrappedResultJSONidurlRequestcontroller參數(shù)等,其定義了主鍵的字符串?dāng)?shù)組ids、主鍵名稱的字符串?dāng)?shù)組primarykeyWrappedResult平臺提供JPA,支持這樣做的目的是為了能夠清晰地劃分應(yīng)用程序?qū)哟味还苁褂煤畏N數(shù)據(jù)和事務(wù)管理技術(shù),從而降低各個應(yīng)用程序?qū)ο笾g的耦合。業(yè)務(wù)邏輯不再依賴于特定的數(shù)據(jù)與事務(wù)策略;不再有硬編碼的資源查找。SpringdataJpaRepository:最頂層接口,是一個空的接口,目的是為了同一所有RepositoryCrudRepositoryRepositoryCURD<SextendsT>Ssave(S TfindOne(ID idvoiddelete(ID idPagingAndSortingRepository:CurdRepositoryIble<T>findAll(Sort 僅排序無分Page<T>findAll(Pageable JpaRepository:該接口繼承了PagingAndSortRepository接口和QueryByExampleExceutorList<T>findAll(); 查詢所有對象,返回ListList<T>findAll(Sortsort); List<T>findAll(Ible<ID>ids); ListlistJpaSpecificationExecutorJPACriteriaps:Spring-data-jpajpabuilderQuery實現(xiàn)Page<T>findAll(Specification<T>spec,Pageablepageable);方toPredicate(Root<Product>CriteriaQuery<?>query,CriteriaBuildercb)即可.其中:Root:個部分,如:select、where、groupby、orderbyPredicate:CriteriaBuilderPredicate的條件方法(equal、notEqual、gt、ge、lt、le、likepublicinterfaceEmployeeRepositorypublicinterfaceEmployeeRepositorypublicLongcountByDepId(String}JpaRepositoryps:SpringDataJPApublicpublicinterfaceEmployeeRepositorypublicEmployeefindByEmployeeIdStringid)根據(jù)員工id工}Id,然后檢查剩下的字符接著處理剩下部分(EmployeeId),先判斷Employee所對應(yīng)的類型是否有2“Employee.employeeId”的值進(jìn)行查詢。Springdatajpa@Query法上使用@QuerypublicpublicinterfaceEmployeeRepositoryJpaRepository<Employee,String>,JpaSpecificationExecutor<Employee>{@Query("selectefromEmployeeewheree.depId=?1")publicList<EmployeefindByUuidOrAge(intuuid);--根據(jù)部門id查詢部}
方法的參數(shù)的個數(shù)必須和@Querylike,publicpublicinterfaceEmployeeRepositoryJpaRepository<Employee,String>,JpaSpecificationExecutor<Employee>{@Query("selectefromEmployeeewherelike%?1%")publicList<EmployeefindByEmployeeNameStringname);--查詢名字}通過創(chuàng)建方法名來做查詢,只能做簡單的查詢,Springdatajpa提供了JpaSpecificationExecutorJPACriteriaRoot:CriteriaQuery:specific如:select、where、groupby、orderbyPredicate:方法(equal、notEqual、gt、ge、lt、le、like(SpringdatajpaEmployeeRepository,接口中封裝一系列的持久化方法。privateEmployeeRepositorypublicEmployeesaveEmployee(Mapmap)Employeeemployee=newEmployee();if(map.containsKey("id")){trytryStringid=(String)map.get("id");employee=employeeRepository.findOne(id);CrudUtils.mapToObject(map,employee,}catch(Exceptione)//TODOAuto-generatedcatchblock}try}catch ception|e)//TODOAuto-generatedcatchblock}}return}publicpublicvoidremove(IDRequestObjectidObject){String[]ids=idObject.getIds();for(Stringid:ids)}@EntitypojojpapublicclassUsersimplementsSerializable}@Table(name="users")userspublicclassUsersimplementsSerializable}publicclassUsersimplementsSerializable{privateString通過@C:.unique:.nullable:.inserttable:.updateable:.columnDefinition:.secondaryTable:從表名。如果此列不建在主表上(默認(rèn)建在主表@Column(name="user_code",nullable=false,length=32)//設(shè)置userCodeuser_code,32,非空privateString@Column(name="user_wages",nullable=true,precision=12,privatedoublewages;privateDatejoinDate;在加載數(shù)據(jù)的時候可以為其指定順序,使用@OrderBy@Table(name=publicclassUser{ @OrderBy(name="group_nameASC,nameDESC")privateListbooks=new}publicclassUsersimplementsSerializable{@Column(name="user_id",nullable=false)privateintuserId; 通過一個表來實現(xiàn)主鍵id的自publicclassUsersimplementsSerializable{@Column(name="user_code",nullable=false)privateStringsequenceSequenceSEQUENCE,如果沒有就不能用publicclassUsersimplementsSerializable@Column(name="user_id",nullable=false)privateintuserId;JPAORMhibernateUUIDPojo@Table(name=publicclassOneimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Column(name="ONE_ID",nullable=false)privateStringoneId;@Column(name="DESCRIPTION")privateStringdescription;@OneToMany(cascadeCascadeType.ALL,mappedBy"oneId")//指向pojoprivateCollection<Many>Pojo@Table(name=publicclassManyimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Column(name="MANY_ID",nullable=false)privateStringmanyId;@Column(name="DESCRIPTION")privateStringdescription;@JoinColumn(name="ONE_ID",referencedColumnName=@ManyToOne//設(shè)置在“一方”pojoprivateOneoneId;多的級聯(lián)頭疼了一陣子,JPA的多對多還需要實際的嘗試一下才能有所JPAPojo@Table(name=publicclassManyAimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Column(name="MANYA_ID",nullable=false)privateStringmanyaId;@Column(name="DESCRIPTION")privateStringdescription; privateCollection<ManyB>@Table(name=publicclassManyBimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Column(name="MANYB_ID",nullable=false)privateStringmanybId;@Column(name="DESCRIPTION")privateStringdescription;@ManyToMany(mappedBy="manybIdCollection")privateCollection<ManyA>Pojo@Table(name=publicclassOneAimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Column(name="ONEA_ID",nullable=false)privateStringoneaId;@Column(name="DESCRIPTION")privateStringdescription;@OneToOne(cascade=CascadeType.ALL,mappedBy="oneA")/PojoprivateOneBPojo@Table(name=publicclassOneBimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Column(name="ONEA_ID",nullable=false)privateStringoneaId;@Column(name="DESCRIPTION")privateStringdescription;@JoinColumn(name="ONEA_ID",unique=ture="ONEA_ID",insertable=false)//設(shè)置從方指向主方的關(guān)聯(lián)外鍵,ONEA_IDT_ONEAprivateOneA10@LobBlob@Column(name="PHOTO")privateSerializablephoto;@LobClob@Column(name"DESCRIPTION")privateStringdescription;privateintpublicintgetTempValue(){gettempValue;}publicvoidsetTempValue(intvalue){this.tempValue=value;}策略,對于繼承實體,Java.persistence.InheritanceType3Hibernate微服務(wù)框架中調(diào)用服務(wù)有兩種方式一種是Ribbon+RestTemte,另外一種是Feign。使用@Feign注解時,ribbon就會自動被添加。由此來實現(xiàn)調(diào)用服務(wù)的目的。compilecompilegroup:'org.springframework.cloud',name:'spring-cloud-ribbon',version:以下通過-a服務(wù)調(diào)用service-a、service-b為例(負(fù)載),來說明如何通過service-b返回相應(yīng)數(shù)據(jù)。創(chuàng)建啟動類Application,這里我們需要一個RestTemte,并且使public Applicationpublicstaticvoidmain(String[]args){ Application.class,args);} te returnnew }}在controller層添加-a服務(wù)調(diào)用service-a服務(wù)的邏輯代 te.getForObject(Stringurl,ClassresponseType,String... te.getForObject(url+"get/{id}.do",String.class,publicclassTestController{ terestTem publicStringhi(@RequestParamStringreturn}}為了實現(xiàn)負(fù)載功能,這里要新建一個服務(wù)service-a,service-b,兩個服務(wù)的代碼基本 publicclassTestController{privateStringport; publicStringhi(@RequestParamStringreturn"hi"+id+"service-}} publicclassTestController{privateStringport; publicStringhi(@RequestParamStringreturn"hi"+id+"service-}} .serviceUrl.defaultZone=http://通過瀏覽 compilecompilegroup:'org.springframework.cloud',name:'spring-cloud-feign',version:以下通過-b服務(wù)調(diào)用service-a、service-b為例(負(fù)載來說明如何通過的方式實現(xiàn)負(fù)載均衡服務(wù)-b發(fā)送url請求及參數(shù)設(shè)置調(diào)用service-a或service-b新建-b服 publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}在-b中新建一個ServiceAFeign來調(diào)用service-a服 (value"service-a"這里的value對應(yīng)調(diào)用服務(wù)的publicinterfaceServiceAFeign (value=Stringhi(@RequestParam("id")String}在controller層添加-b服務(wù)調(diào)用service-a服務(wù)的邏輯代publicclassTestController{;publicStringhi(@RequestParamStringreturn }}通過瀏覽 調(diào)用調(diào)用getForEntity實現(xiàn)get 返回值@return publicMap<String,Object> ResponseEntity<Map>map=restTem Map<String,Object>return}rest.getForEntity 參數(shù)介紹: 返回值@return publicMap<String,Object> ResponseEntity<Map>map=restTem Map.class,"www",1);Map<String,Object>return}test 返回值@return publicString Map<String,Object>m=newHashMap<String,Object>();m.put("param","test");m.put("red", ResponseEntity<String>map=restTem StringString te.getForObject(url,return}test參數(shù)為
返回值@return publicList Map<String,Object>m=newHashMap<String,Object>();m.put("param","test");m.put("red",List<User> te.getForObject(url,return}@param@param publicString HttpHeadersrequestHeaders=newHttpHeaders();requestHeaders.set("head","xxx");Map<String,Object>m=newHashMap<String,Object>();m.put("param","test");m.put("red", HttpEntity<?>requestEntity=newHttpEntity(requestHeaders);HttpEntity<String>response= te.exchange(url,HttpMethod.GET,requestEntity,String.class,Stringreturn}參數(shù)返回值@return publicMap<String,Object>String HttpHeadersrequestHeaders=newHttpHeaders();requestHeaders.set("head","password"); Map<String,Object>m=newHashMap<String,Object>();m.put("param","test");m.put("red",//通過HttpEntityHttpEntity<?>request=newHttpEntity(m,//urlrequestresponsTypeResponseEntity<Map>entitymap=restTem request,Map.class);Map<String,Object>return}參數(shù)返回值@return publicMap<String,Object>String HttpHeadersrequestHeaders=newHttpHeaders();requestHeaders.set("head","password"); Map<String,Object>m=newHashMap<String,Object>();m.put("param","test");m.put("red",//通過HttpEntityHttpEntity<?>HttpEntity<?>request=newHttpEntity(m,//urlrequestresponsTypeMap<String,Object>mapobj=restTem request,Map.class);return}@throwspublicMap<String,Object>restGetRequest(@PathVariableparam,@PathVariableIntegerred)throws Map<String,Object>map=newHashMap<String,Object>();map.put("param",param);map.put("red",red);returnmap;}@param@param@throwspublicStringrest(@PathVariableStringparam,Integerred)throws returnparam+":"+red;}}@param@param@throwspublicListrest1(@PathVariableStringparam,@PathVariablered)throws Useru=newUser();u.setAge((short)1);List<User>l=newArrayList();return}@param publicMap<String,Object>restPost(@RequestBodyMap<String,Object>map.put("aaa","ffffff");returnmap;}所需依賴包:spring-cloud-starter-hystrix-compilecompilegroup:'org.springframework.cloud',name:'spring-cloud-starter-version:何通過Ribbon+RestTemte的方式,介紹斷路器的使用。Application@EnableHystrixhystrixpublicclassApplicationpublicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);} te returnnew }}Controller,使 mand指定回調(diào)方publicpublicclassTestController terestTem mand(fallbackMethod=publicStringhi(@RequestParamStringreturn}publicStringhiFallback(Stringid)return"hi,"+id+",}}啟動-a,然后關(guān)閉service-a,打開頁Feign這里只需要在@Feign注解上加上fallback就可以 (value="service-a",fallback Fallback.class這里的namepublicinterface{(value=Stringhi(@RequestParam("id")String}添加ServiceAFeignFallback的實現(xiàn)publicclassFallback publicStringhi(Stringid)return"hi,"+id+",}}-b,service-a,無類無無 getHourMinSec(long(yyyy-getYear(DategetMonth(DategetDay(DategetHour(DategetMinute(DategetSecond(DategetMillis(DategetTime(DateHH:mm:ssgetDateTime(DateHH:mm:ssaddDate(Datedate,intdiffDate(Datedate,DategetMonthBegin(StringgetMonthEnd(StringformatDate(DateformatDateByFormat(Datedate,getDate(Date getDaysBetween(java.util.Calendarjava.util.CalendargetDaysBetween(Stringd1,Stringd2,booleanonlyWorkDay){ifisWorkDay(DategetMinutesBetween(Strings1,String(minutes)yyyy-MM-getDateBetween(Stringd1,Stringlist,listmap,begindate,最后一天Stringyyyy-after(Stringd1,Stringd2afndEqual(Stringd1,StringdayMove(Stringdate,intmonthMove(Stringdate,intgetBetweenDate(Stringb1,Stringe1,Stringb2,String無類無無無set(intfield,intget(intaddTime(TimeUtilsubtractTime(TimeUtil設(shè)置時間字段的分隔符(間patternQuote(String正則表達(dá)式處理方法,源自無類無無無add(doublev1,doublesub(doublev1,doublemul(doublev1,doublediv(doublev1,doublegetFactorial(int無類無無無add(Matrixsub(MatrixmultiplyNum(doublemultiply(Matrixdivide(Matrixdisequals(Object獲取矩陣的hashCodeObject類的canConvert2Matrix(double[][]cloneArray(double[][]arrayToString(double[][]value無類無無無無byte2Byte(byteByte2byte(Byteint2Integer(intInteger2int(IntegerPri無類無無無isPrime(intshowPrimber(intsieve(int實現(xiàn)隊列功能數(shù)據(jù)元素只能從隊尾進(jìn)入,從隊首取出。在隊列中,數(shù)據(jù)元都是隊首的數(shù)據(jù)。Map無類無無無add(ObjectindexOf(ObjectlastIndexOf(Object無類無無無getTraRoundMath(doublegetTraRound(double getRound(doubledou,intscale,無類無無無getRandomMethodA(intgetRandomMethodB(intoutputArray(Integer[]無類importjava.util.ArrayList;importjava.util.Itor;importjava.util.LinkedHashSet;importjava.util.List;importimportjava.util.regex.Matcher;import無無isNullOrEmpty為nulltrue;equal(Strings1,Stringsplit(Stringstr,Stringrece(Stringfrom,String串toLength(Stringstr,intisInteger(StringisDouble(String判斷是否為浮點數(shù),包括double和isLetter(Stringcparse(Stringis(Stringis(StringhangeToBig(StringremoveSameString(Stringencoding(StringisHandset(Stringdecoding(Stringint2str(intstr2int(Stringdouble2str(doublestr2double(StringisLetterOrDigit(String成isBlank(String檢查字符串是否是空白:<code>null</code>果為空白 則返defaultIfNull(String如果字符串是<code>null</codecode>""/code>如果字符串是<code>null</codedefaultIfEmpty(String<code>"</code><code>"</code>defaultIfBlank(String空字符串<code>""</code>或只有空白字符,則返回空字符串trimAll(Stringtrim(String<code>null</code>trim(Stringstr,String串是<code>null</code>,依然返回trimStart(String返回trimStart(Stringstr,String<code>null</code>,依然返回trimEnd(String<code>null</code>,則返trimEnd(Stringstr,String<code>null</code>,依然返回trimToNull(StringtrimToEmpty(String除去空白的字符串,如果原字串為<code>null</code>或結(jié)果字符串為<code>""</code>,則返回trim(Stringstr,StringstripChars,int串是<code>null</code>,依然返回equals(Stringstr1,StringisAlpha(StringisAlphaSpace(String判斷字符串是否只包含unicode空格<code>''</codeisAlphanumeric(String判斷字符串是否只包含unicodeisAlphanumericSpace(String判斷字符串是否只包含unicode字和空格<code>'code>isNumeric(String果字符串非<code>null</code>并且全由unicode數(shù)字組成,則返回isNumericSpace(String判斷字符串是否只包含unicode數(shù)字和空格<code>''</code>。如果字符串<code>null</code>unicode數(shù)字和空格組成,則返回isWhitespace(String果字符串非<code>null</code>并且全由unicode空白組成,則返回toUpperCase(StringtoLowerCase(String則返回capitalize(Stringode>大寫的字符串,如果原字符串為<code>null</code>,則返uncapitalize(String返回swapCase(String的字符串,如果原字符串為<code>null</code>,則返toCamelCase(Stringcamelcasecamelcase字符串,如果原字符串為<code>null</code>,則返toPascalCase(String將字符串轉(zhuǎn)換成pascalcase。返回pascalcase為<code>null</code>toUpperCaseWithUnderscores(String將字符串轉(zhuǎn)換成下劃線分隔的大寫字符串。返回下劃線分隔的大寫字符串,<cod>null</ode>,則返回toLowerCaseWithUnderscores(String將字符串轉(zhuǎn)換成下劃線分隔的小寫字符串。返回下劃線分隔的小寫字符串,<cod>null</ode>,則返回split(String字符串?dāng)?shù)組,如果原字符串為<code>null</code>,則返split(Stringstr,char字符串?dāng)?shù)組,如果原字符串為<code>null</code>,則返split(Stringstr,StringseparatorChars,intmax)字符串?dāng)?shù)組,如果原字符串為<code>null</code>,則返join(Object[]連接后的字符串,如果原數(shù)組為<code>null</code>,則返join(Object[]array,char<code>null</code>,則返回join(Object[]array,String連接后的字符串,如果原數(shù)組為<code>null</code>,則返joinWithoutSpace(String[]array,<br>"a","","b"-->join(Itoritor,char返回 返回indexOf(Stringstr,char匹配的索引值。如果字符串為indexOf(Stringstr,charsearchChar,int匹配的索引值。如果字符串為indexOf(Stringstr,String個匹配的索引值。如果字符串為indexOf(Stringstr,StringsearchStr,int個匹配的索引值。如果字符串為 <cde>null/code><code>-1</code><code>null</code>或空,也返回 <cde>null/code><code>-1</code><code>null</code>或空,也返回 在字符串中查找指定字符串集合中的字<code>ull</coe返回<code>-1</ode>。如果字符串集合為<cod>null</ode>/code>"</code><code>null/code>,則返回 在字符串中查找不在指定字符集合中的<code>ull</coe返回<code>-1</ode>。如果字符集合為<code>ull</coe> 在字符串中查找不在指定字符集合中的<code>ull</coe返回<code>-1</ode>。如果字符集合為<code>ull</coe>lastIndexOf(Stringstr,charlastIndexOf(Stringstr,charsearchChar,intstartPos) searchStr,intstartPos) 始索引。如果字符串為1</code>如果字符串集合為<code>null</code>或空,也返回<code>null</code>,則返contains(Stringstr,char<cde>null/code>containsOnly(Stringstr,char[]<code>null</code>返回containsOnly(Stringstr,String<code>null</code>返回countMatches(Stringstr,String返回substring(Stringstr,int始串為<code>null</code>,則返回substring(Stringstr,intstart,int始串為<code>null</code>,則返回left(Stringstr,int<code>null</code>,則返right(Stringstr,int<code>null</code>,則返mid(Stringstr,intpos,int字串為<code>null</code>,則返回 返回子串,如果原始串為<code>null</code>,則返 返回子串,如果原始串為<code>null</code>,則返substringBeforeLast(Stringstr,String回子串,如果原始串為<code>null</code>,則返 回子串,如果原始串為<code>null</code>,則返substringBetween(Stringstr,String串。返回子串,如果原始串為<code>null</code>或未找到分隔子 open,Stringclose)如果原始串為<code>null</code>或未找到分隔子串,則返回 Stringclose,int如果原始串為<code>null</code>或未找到分隔子串,則返回deleteWhitespace(String刪除所有白后的字符串,如果原始字符串為<code>null</code>,則返receOnce(Stringtext,StringString符串為<code>null</code>,則返回rece(Stringtext,Stringrepl,Stringwith,intmax)為<code>null</code> charre符串為<code>null</code>,則返回 Stringre回overlay(Stringstr,Stringoverlay,intstart,intend)為<code>null</code>chomp(String為<code>null</code>chomp(Stringstr,String則返回chop(String符的字符串,如果原始字符串為<code>null</code>,則返repeat(Stringstr,intnn字符串,如果原始字符串為<code>null</code>,則返alignLeft(Stringstr,int擴(kuò)展并左對齊字符串,用空格<code>'符串,如果字符串<code>null</code>,則返alignLeft(Stringstr,intsize,<code>null</code>,則返回alignLeft(Stringstr,intsize,String符串為<code>null</code>,則返回alignRight(Stringstr,int擴(kuò)展并右對齊字符串,用空格<code>'返回alignRight(Stringstr,intsize,char<code>null</code>,則返回alignRight(Stringstr,intsize,String符串為<code>null</code>,則返回center(Stringstr,int擴(kuò)展并居中字符串,用空格<code>'符串,如果字符串<code>null</code>,則返 擴(kuò)展并居中字符串,用指定字符填充兩邊。返回擴(kuò)展后的字符串,如果字符串為<code>null<code>,則返回center(Stringstr,intsize,String<code>null</code>,則返回reverse(String<code>null</code>,則返abbreviate(Stringstr,int將"Nowisthetimeforallgoodmen"轉(zhuǎn)換成"Nowisthetime字符串為<code>null</code>則返回abbreviate(Stringstr,intoffset,將"Nowisthetimeforallmen""...isthetime字符串為<code>null</code>則返回difference(Stringstr1,String getLevenshteinDistance(Strings,Stringmin(inta,intb,intparseInTokens(Stringstr,StringStringcapitalFirstLetter(StringlowerFirstLetter(String無類無無contains(String[]Stringsubtract(String[]String[]strArrToString(String[]trim(String[]無類無無prepad(Strings,intlengthprepad(Strings,intcharpostpad(Strings,intlengthpostpad(Strings,intcharmidpad(Strings,intlengthmidpad(Strings,intcharsplit(Strings,Stringdelimitersdelimiterresult:splitIncludeDelimiters(Strings,Stringdelimiter)字符串?dāng)?shù)組。EgStringHelper.split("-1--2-","-");result:{"","-","1","-","","-join(String[]join(String[]array,delimiterrece(Strings,Stringfind,Stringrece)","|")result:escapeHTML(StringescapeSQL(StringescapeJavaLil(Stringtrim(Strings,StringunescapeHTML(Stringtringterms,StringBufferString[]ring[]n(String[]String[]containsAny(Strings,equalsAny(Strings,startsWithAny(Strings,endsWithAny(Strings,containsAnyIgnoreCase(StringString[]equalsAnyIgnoreCase(StringString[]s,String[]endsWithAnyIgnoreCase(StringString[]XMLJavaJavaAPIforXMLProcessingXSLXML無類無無xmlFileName,StringXMLXML無類無無object2XML(ObjectStringoutFileName)throwsthrowsinFileName)把XML文件成對象返回生成的對象@throwsSAXReaderXMLReaderSAXReaderXMLReader無類無無XML,XMLXML,XML無類org.dom4j.無無load(Stringfile)throwsException文件@throws @throwsSAXException@throwsIOExceptionaddChild(NodeNoderemoveChild(NodeNodesave(Stringfile)throws保存文件@throwsTransformerException@throwsXMLWriterXMLWriter無類無無getWriter(Stringurl,XMLWriterurl無類無無in,String throwsStringTObyte(StringInputStreamTOByte(InputStreamthrows throwsgetString(StringgetBytes(InputStreamis)InputStream根據(jù)文件路徑創(chuàng)建文件輸入流處理位(unicode)getFileInputStream(File根據(jù)文件對象創(chuàng)建文件輸入流處理位(unicode) boolean根據(jù)文件對象創(chuàng)建文件輸出流處理位(unicodeboolean根據(jù)文件路徑創(chuàng)建文件輸出流處理以字節(jié)為單位(非unicode)fileInputStreamgetFile(String提供AES加AES無類無無 throws throwsStringkeyseed)throwsStringkeyseed)throwsJs提供MD5加MD5無類無無無,,getMD5ofStr(StringgetMD5ofStrMD5MD5負(fù)責(zé)等操作負(fù)責(zé)等操無類無無 fileName)throwspostUrl(Stringurl,StringURLPOSTgetUrl(StringURL無類無無 DeserializationContextarg1) 日期格式解析,返回解析后的日期IOException,無類無無無getProperties(String無類無無無getResourceAsStream(String開頭 "a/b/myresource".。返回用于資源的nullObjectobj,Stringrole,Stringdelim,StringtabText)Classclazz,StringClassLoader.getResource(回值。用指定的類文件包,將所有的點(/s無類 無無無Objectobject,StringmethodName,Objectarg)NoSu該方法精確性低于{@link#invokeExactMethod}.該方法遍歷所有匹如果參數(shù)是基本數(shù)據(jù)類型則它的包裝類作為匹配類型處理,比如一個 Objectobject,StringmethodName,Objectarg)NoSu@link#getAccessibleMethod}驗證可訪問的方Classclazz,StringmethodName,Class法就返回<code>null</code>.程序會為你封裝一個<code>Class</code>Classclazz,StringmethodName,ClassClassclazz,StringmethodName,Class[]parameterTypes)法合適的方法是指參數(shù)可以從參數(shù)列表中#invokeMethod(Objectobject,StringmethodName,Object[]args,Class[]parameterTypes)}使用.如果參數(shù)是基本比如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司生活阿姨合同范本
- 變頻器維修合同范本
- 廠家經(jīng)銷分銷合同范例
- 內(nèi)部流程審計服務(wù)合同范本
- 買豬合同范本
- 廚房訂金合同范本
- 變更中標(biāo)合同范本
- 沖壓扣件采購合同范本
- 合作協(xié)議物流合同范本
- 單據(jù)寫合同范本
- 環(huán)保儀器培訓(xùn)
- 2024年全國職業(yè)院校技能大賽中職(大數(shù)據(jù)應(yīng)用與服務(wù)賽項)考試題庫(含答案)
- 2024湖南省水利廳直屬事業(yè)單位招聘擬聘用人員歷年高頻難、易錯點500題模擬試題附帶答案詳解
- 《計算機(jī)網(wǎng)絡(luò)技術(shù)》課程教案(完整版)
- 追覓在線測評題
- 調(diào)崗未到崗解除勞動合同通知書
- 產(chǎn)品標(biāo)準(zhǔn)化大綱
- 西師版小學(xué)數(shù)學(xué)四年級下冊教案
- 2024年電力交易員(中級工)職業(yè)鑒定理論考試題庫-下(多選、判斷題)
- 國有企業(yè)“三定”工作方案-國有企業(yè)三定方案
- 清華大學(xué)2024年強(qiáng)基計劃數(shù)學(xué)試題(解析)
評論
0/150
提交評論