# 檢查POJO裡面各屬性的資料長度 ### 因為在工作上遇到MSSQL常常報錯:Error updating database.Cause:com.microsoft.sqlserver.jdbc.SQLServerException: 字串或二進位資料會被截斷。 ### 所以決定寫一個共用程式來檢查到底哪個資料欄位超過長度了 ```java= /** * 檢查傳進來的資料欄位長度是否大於DB裡面的欄位長度 * @param pojo 要檢查的bean * @param getLenMethodName 做一個輸入欄位名稱會回傳該欄位名稱在DB裡面的欄位長度的方法 , 傳進來方法名稱 * @return */ public static String checkFieldLength(Object pojo,String getLenMethodName) { //取得該POJO的Class Class<?> cls = pojo.getClass(); //宣告要傳進去的方法名稱和參數型態 Class<?>[] param = new Class[1]; param[0] = String.class; Method m = null; StringBuilder sb = new StringBuilder(); sb.append("\r\n"); sb.append(cls.getSimpleName() + "{\r\n"); try { //取得我們指定的回傳DB欄位長度的方法 m = cls.getDeclaredMethod(getLenMethodName, param); m.setAccessible(true); for (Field f : cls.getDeclaredFields()) { //取得每個屬性 Field t = cls.getDeclaredField(f.getName()); t.setAccessible(true); sb.append("\t" + f.getName() + ": "); int l = 0; int sl = Integer.parseInt(m.invoke(pojo, f.getName()).toString()); if (t.get(pojo) != null) { sb.append(t.get(pojo).toString()); l = t.get(pojo).toString().length(); } else { sb.append("null"); } sb.append(" ,length: "+l); sb.append(" ,standard length: " + sl); sb.append(" "+compareLen(l, sl)); sb.append("\r\n"); } } catch (Exception e) { logger.error(e.getMessage(),e); } sb.append("}"); return sb.toString(); } // 比較是否長度超出限制 private static String compareLen(int len, int standard) { if (len > standard) { return " **超標!!!** "; } return ""; } ``` 然後在該POJO override toString方法和做一個輸入屬性名稱會回覆該屬性在DB上面的欄位長度 ```java= @Override public String toString() { return NiiOtherAuditUtils.checkFieldLength(this, "getLength"); } // 設定每個欄位的標準長度限制 private int getLength(String fieldName) { int len = 0; if (StringUtils.equals(fieldName, "nosqlKey")) { len = 25; } else if (StringUtils.equals(fieldName, "userId")) { len = 20; } ... ... return len; } ``` 終於可以知道哪個資料的欄位出問題了,不用再花一堆時間看Log檢查資料 ###### tags: java