# 檢查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