1、常見問題html
訪問 請求參數是數組如何接受參數?前端
//http://localhost:9090/pet/getxx?xx=aa&&xx=aa&xx=cc @GetMapping("getxx") public String getxx(String[] xx) { System.out.println(aa+ Arrays.toString(xx));
如何讀取配置文件java
1. 讀取系統的配置文件 Properties pps = System.getProperties(); //.load()能夠加載file.properties配置文件 // Properties pps = new Properties(); // pps.load(new FileInputStream("file.properties")); Enumeration fileName = pps.propertyNames(); while (fileName.hasMoreElements()) { String strKey = (String) fileName.nextElement(); String strValue = pps.getProperty(strKey); System.out.println(strKey + "," + strValue); } 讀取指定文件下配置文件,例如絕對路徑qa.ini下有aa=bb就會輸出bb Properties property = new Properties(); property.load(new FileInputStream("/Users/heliming/IdeaProjects/democloud/kotlindemo/qqa.ini")); String value = property.getProperty("aa"); System.out.println(value);
記一次jar包衝突mysql
報錯有用信息linux
NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
緣由: 項目中我用了springboot,而springboot依賴tomcat,avro-ipc中依賴jetty,tomcat和jetty都是servlet規範的容器,致使jetty的servlet-api和tomcat的包重複了。 最終:把avro-ipc的servlet-api包去除,只加載tomcat中的servlet-api包 nginx
帶類型轉換正確姿式git
package top.util; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; /** * description: * * @author: dawn.he QQ: 905845006 * @email: dawn.he@cloudwise.com * @email: 905845006@qq.com * @date: 2019/9/9 5:59 PM */ public class Aaa { public static void main(String[] args) { //Integer HashMap m = new HashMap<String, Integer>(); m.put("buibui", 1); //String[] // HashMap m = new HashMap<String, String[]>(); // m.put("buibui", new String[]{"fsf","sfff"}); HashMap<String, String[]> parameterMap = null; //map帶泛型正確複製操做 try { if (m instanceof Map) { parameterMap = m; } else { return; } for (Map.Entry<String, String[]> e : parameterMap.entrySet()) { HashMap<String, Object> map = new HashMap<String, Object>(); if (e.getKey() instanceof String) { String k = e.getKey(); map.put("name", k); } if (e.getValue() instanceof String[]) { String[] vals = e.getValue(); //將value內容拷貝出來(防止影響原有數據),並進行URLDecoder.decode操做 String[] params = new String[vals.length]; for (int i = 0; i < vals.length; i++) { String val = vals[i]; System.out.println(val); } map.put("values", params); } else { System.out.println("不是key:string,values:string[]類型"); } } //錯誤操做,直接編譯失敗 // if (m instanceof Map<String, String[]>) { // parameterMap = m; // } else { // return; // } } catch (Exception e) { System.out.println("-------"); return; } System.out.println("0------"); } }
解析:若是m換爲stirng:string[]格式就能正常賦值github
maven打包最好版本一致,否則可能出現不可控因素,例如:算法
Error reading com/xxx/xxx/xxx.class: nullspring
還有就是父maven最好高於子maven的jdk版本
Unsupported major.minor version 52.0的含義
一、釋義:version 52.0 J2SE 8(JDK 1.8) = 52 J2SE 7(JDK 1.7) = 51 J2SE 6.0(JDK 1.6) = 50 J2SE 5.0(JDK 1.5) = 49 JDK 1.4 = 48 JDK 1.3 = 47 JDK 1.2 = 46 JDK 1.1 = 45
二、釋義:Unsupported major.minor version 52.0 大體意思是:本地的環境不支持jdk1.8(即:所部署項目的jdk版本過高:注意是JDK版本過高而非JRE)
分支管理必定是測試完穩定版本後作升級而後加版本號。不能還沒測好直接加版本號。
分支儘可能少,多了很難維護,並且最大弊端是有些不能合併,影響開發效率。
打印日誌的時候,方法開始和結束須要打印日誌,打印日誌必定要打印組裝完成的數據。若是其中一些邏輯複雜也要打印日誌。(補充:額外須要打印時間(打印毫秒,若是執行速度過快打印納秒)和線程id)
測試的時候必定要規範,好比在那臺機器上測試,測試內容,服務器帳號密碼,測完的例子啓動方式,如何出現的bug,日誌要保留下來,方便研發找問題,若是不記錄的後果就是,還得重新再測一遍看日誌,看項目的日誌,若是環境掛掉了,還得從新看環境的問題,可能第一次測試就白測試了,還會浪費時間。
代碼裏邊的一些常量,若是屬於一類的,最好作區分,
例如: public interface Constant { /** * 公共常量 */ class Public { public static final String ID = "TESTID"; } /** * JSP路徑 */ class JspFilePath { public static final String TESTCONTROLLER = "jsp/basic/"; public static final String TEMPLATE_PAGEPATH = "basic/template/"; // 模板(測試) }
}
分析問題先從面分析,再從點分析,各個方面都分析完成後,逐個點擊破。
多線程問題總結:
若是是多線程應該是一個主線程作數據組裝,各個子線程作數據處理,這樣的話在主線程哪裏作數據抓取是很是有必要的,若是子線程數據須要抓取,只須要在子線程抓取完數據後,跟主線程串聯起來就能夠了。由於線程也是堆棧作的,上下級是有關聯的。
Integer 判斷判斷對象null 判斷intValue()不爲0
bean拷貝
幾個集合不能共用一個bean(若是共用了數據只有一份更改全部的都會更改須要拷貝或者新new bean)
Integer不能和String用equlse比較
轉string或者都轉int 轉String s = Integer.toString(wmAnswerLabel.getId())用equalse Integer類型的要轉換爲int用== 轉int a1=a.intValue(); String轉int i=Integer.parseInt(s1);
二維碼條形碼字符串長度漢字計算jsonjava互轉
http://www.ofmonkey.com
用mybatis mapper 修改多條sql的時候提示sql語句出錯
配置拼接參數加&allowMultiQueries=true jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true 若是是用的德魯伊數據庫,還須要配置 WallConfig wc = new WallConfig(); wc.setMultiStatementAllow(true); //容許一次執行多條語句 wc.setNoneBaseStatementAllow(true); //容許一次執行多條語句
18/12/25
18/12/26
若是導出svn項目出錯別人導出svn項目正確,而且報一些稀奇古怪的問題,從新打開一個可用的idea工做空間(刪除原先的文件夾從新建立個)導出svn,多是idea工具的問題
導出項目的時候若是編譯不成功clean下把targe包清除了繼續編譯編譯仍是不成功,若是錯誤根本不知道就換工做空間吧。
18/1/7
maven pom.xml若是是錯的,deploy後maven是不會從私服下載新的jar包的
若是deploy項目依賴的私服必須是同一個 就是多個項目的maven的setting。xml配合的帳號密碼必須一致 18/1/9
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mmednet.assessment.project.scheme.dao.SchemeSportFoodBaseDao.getSchemeSportFoodBase
通常是mapper.xml中 SchemeSportFoodBaseDao的包路徑寫錯了
dubbo服務本地調用不通能夠
dubbo服務名->提供者->找到本地和服務器dubbo 加權或者禁用服務器的dubbo服務只啓動本地的dubbo服務測試
18/1/10
@Select(....)註解的做用就是告訴mybatis框架,執行括號內的sql語句
s_id id,s_name name,class_id classid 格式是 字段名+屬性名,例如s_id是數據庫中的字段名,id是類中的屬性名
這段代碼的做用就是實現數據庫字段名和實體類屬性的一一映射,否則數據庫不知道如何匹配
where s_name= #{aaaa} and class_id = #{bbbb} 表示sql語句要接受2個參數,一個參數名是aaaa,一個參數名是bbbb,若是要正確的傳入參數,那麼就要給參數命名,由於不用xml配置文件,那麼咱們就要用別的方式來給參數命名,這個方式就是@Param註解
在方法參數的前面寫上@Param("參數名"),表示給參數命名,名稱就是括號中的內容
public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id); 給入參 String name 命名爲aaaa,而後sql語句....where s_name= #{aaaa} 中就能夠根據aaaa獲得參數值了
18/1/11
加密算法在windows測試正經常使用linux測試不正常
問題:Given final block not properly padded 緣由:SecureRandom?實現徹底隨操做系統自己的炔孔刺��©非調用方在調用?getInstance?方法,而後調用?setSeed?方法; 該實如今?windows?上每次生成的?key?都相同,可是在?solaris?或部分?linux?系統上則不一樣。關於SecureRandom類的詳細介紹, SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG") ; secureRandom.setSeed(password.getBytes()); kgen.init(128, secureRandom);
sql截取str中strsub出現的最後位置前邊的字符串
select left(str,LENGTH(str) - LOCATE(REVERSE(strsub), REVERSE(str)))
sql截取str中strsub出現的最後位置後邊的字符串
select right('fad_rer_rew',LOCATE(REVERSE('_'), REVERSE('fad_rer_rew'))-length('_'))
18/1/12
idea中tomcat 亂碼
1.tomcat service.xml 中加utf-8無論用 2.tomcat catlina中加utf-8無論用 3.idea tomcat vm 中設置tomcat的utf-8無論用 4.idea seting encoding 設置utf-8 無論用 最後絕招 前提是你以上都試過確定無論用了 打開idea安裝目錄-bin 用記事本打開idea.exe.vmoptions和idea64.exe.vmoptions文件 在文件後面添加一行:-Dfile.encoding=UTF-8 idea 2018 的 vmoptions配置無效只能手動改 vmoptions文件
18/1/15
jms 的消費的生產 註解和mxl方式
解決使用FastJson反序列化泛型類時,內部嵌套類型沒法正確識別的問題//https://chenzhihao.cc/archives/375
A a = JSON.parseObject(str,new TypeReference<A>() { });
18/1/18
上傳文件時候加Content-Type application/x-www-form-urlencoded請求頭,和Content-Type: multipart/form-data;
springmvc中(@RequestParam中required不能爲false 若是加了會file和上傳的字段數據會重置爲null 例如: 錯 @RequestParam(value = "fileData",required = false 對 public ResponseParam upload(@RequestParam(value = "fileData") MultipartFile file,
18/1/22
mybatis 多個字段dao要加@Param mapper要加parameterType="map" 18/1/23
寫測試類的時候不要寫main函數用@test代替
mapper.xml中能返回int不要返回map儘可能簡單 18/1/24
https://san-yun.iteye.com/blog/1987852
log4j轉到logback 加log4j-over-slf4j包1.7.21 , 遇到的問題:log4j-over-slf4j包必定要在log4j包前邊加載,就是maven配置jar包先寫log4j-over-slf4j包在寫log4j包 ,否則slf4j不會橋接log4j包 netstat -an|findstr 8080 查看端口
18/1/25
IDEA中Maven配置—下載不了jar包
解決問題:用idea自帶的maven File—Settings—Maven .maven home directory:指的是maven路徑,以前我配置的是本身安裝maven的路徑,如今 Bundled(Maven 3)是idea自帶的(選這個不能選本身的) User settings file:是settings路徑,最好用本身配置settings文件。本身可能配置私服
local repository:指倉庫路徑。最好本身配置,jar包太多放c盤不合適
若是說找不到mapper.xml中方法,name去看看是不是沒有掃描到包(上次複製別人項目把掃描包直接寫成userMapper了,至於怎麼都找不到別的mapper文件,坑) 寫功能前最好先寫構思邏輯,寫好了再寫功能,能避免一些沒必要要的麻煩
18/1/28
maven deploy之後若是仍是構建失敗多是服務器maven依賴本地jar包,那麼刪除服務器本地jar包重新上傳吧
mybatis 若是是計算數量什麼的最好返回值直接就是int。 18/1/29 1. com.alibaba:fastjson:反序列化 若是字段中有isXXX須要 加
@JSONField(name = "isDeleted") @JSONField(name = "isDeleted") private boolean isDeleted; A a = new A(); a.setDeleted(false); String msg = JSON.toJSONString(a);
19/2/11 結論
in()適合B表比A表數據小的狀況 (在內存比較)
exists()適合B表比A表數據大的狀況(在a表和b表結果集比較)
當A表數據與B表數據同樣大時,in與exists效率差很少,可任選一個使用. select * from A where id in(select id from B) 修改一個表 -- 錯 update a_test1 as test1 -- set name (select * from a_test1 as intest1 -- where intest1.name = test1.name -- ) -- 對 update a_test1 a -- inner join a_test1 as intest1 on a.name = intest1.name -- set a.name = 'af' -- 對 update a_test1 a,a_test1 as intest1 -- set a.name = intest1.name 計數 -- select sum(if(name='blue',1,0)),sum(if(name='red',1,0)) from a_test1 -- 加 or null -- select count(name = 'blue' or null),count(name = 'red' or null) from a_test1 爲何要加or null?1.由於count(參數) 只要參數不爲null,都會進行計數,只寫year=2006(至關於year==2006)是個true,計數,若是不加or null,那麼year==2007 或者year==2008是個false,也會進行計數。2.若是加了or null 的話 ,year==2006是個ture,true or null 是true 會計數;year==2007是個false,false or null 等於null,則不會計數。能夠參考這個 文章https://wangyaoxu.github.io/2017/09/21/mysql-count/
優化分頁查詢
select * from a_test1 inner join (select id from a_test1 ORDER BY name limit 2 ,3 ) as lim using(id)
19/2/18 //5.2後棄用
List<Object[]> resutLists = super.getSession().createSQLQuery(sql.toString()).setParameter(1,"").setResultTransformer(Transformers.aliasToBean(ArticleDto.class)).list();
//5.2後使用
List<Object[]> resutList = (List<Object[]>) super.findBySql(sql.toString(),0,0); List<ArticleDto> list = BeanHelper.transformTuple(resutList, ArticleDto.class, new String[] { "id", "cid", "title", "subTitle", "author", "url", "priority", "cover", "summary", "content", "pv", "publishDate", "cname"}); //查詢 sessionFactory.getCurrentSession(); List<Object[]> resutLists = super.getSession().createNativeQuery(sql.toString(),ArticleDto.class).setParameter(1,"").setParameter(2,"").unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP) .list(); //增刪改 int i = super.getSession().createNativeQuery(sql.toString()).setParameter(1,"").setParameter(2,"").executeUpdate(); //用上邊的兩種,這種能夠不用了 List<Map<String,String>> mapList = Lists.newArrayList();
19/2/19
@Transactional(rollbackFor = Exception.class)
rollbackFor:一組異常類的實例,遇到時必須進行回滾
rollbackForClassname:一組異常類的名字,遇到時必須進行回滾
noRollbackFor:一組異常類的實例,遇到時必須不回滾
noRollbackForClassname:一組異常類的名字,遇到時必須不回滾
若是異常被try{}catch{}了,事務就不回滾了,若是想讓事務回滾必須再往外拋try{}catch{throw Exception}。 必須在catch中手動回滾; nginx 413錯誤 client_max_body_size 8M; client_body_buffer_size 128k;
19/2/21
//把a的數據拷給b
B b = new B(); BeanUtils.copyProperties( a,b); spring-mvc @RequestMapping 多個url映射到一個方法 @RequestMapping攔截多個請求 @RequestMapping(value={"url","resturl"})
19/2/22
dubbo.protocol.dubbo.payload=11557050(默認爲8M,即8388608) 19/3/21
服務調用
@Reference(cluster="failfast",interfaceClass=PadPersonalApi.class,lazy=true,check=false,timeout=5000) 添加 lazy=true,check=false 註解當PadPersonalApi服務沒有啓動也不會影響當前服務啓動
19/6/12
今天遇到一個問題 後端返回到jspmodel是個id取值居然是maven的名稱 而後從新把返回的名稱換成ids命名就能夠取到值了,暫時沒找到緣由。windows下沒事,linux下須要不能爲id,神奇
El表達式中參數是空的取值會報錯的,不肯定的注意判斷空。
有些接口不方便的測試其實能夠用get、post請求對接前端直接測試好比sign,token驗證的問題。Httpclient、 okhttp工具等都很不錯,pom文件引入直接main方法就行。
建立服務
建立新服務或者加新功能須要依賴的時候注意配置文件,和配置類都要加上,有的是在配置類裏邊注入到spring bean中的。
Dubbo消費者注意消費提供者的時候若是不加懶加載消費不到會報錯的。
跟spring 的autowire若是注入對象爲null不設置false同樣。須要設置。
Nginx配置 建立服務的時候請求路徑是服務名稱/加本身定義的路徑,否則配置nginx會很麻煩
若是是4開頭的通常是前端沒到後端 5開頭的是服務器響應錯誤 須要注意
代碼規範
業務邏輯最好都抽到service處理,方便controller查看接口,不至於controller太臃腫 數據最好都都判斷非空,數據格式、類型轉換須要注意異常。
2019/12/15
隊列名稱發送消息,接受消息必定要打印日誌
初版軟件寫完必定要寫自動化部署腳本,以及經常使用腳本。 業務分明,公共類,和單個應用使用的要作區分
架構選型
若是是頻繁訪問直接選長鏈接,若是訪問不頻繁且數據量小直接選用短連接。
若是是不頻繁訪問,數據量大選用長鏈接。應爲可能須要支持斷點續傳數據。
一個應用中能夠長短鏈接搭配使用。
合理的一個應用應該是: 入口-》鑑權-》訪問各個應用-》緩存-》數據庫 其中能夠穿插一些mq做爲數據解耦合。