在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单、服务器|网络设备重启工单、服务器光纤网线更换工单、网络设备撤线布线工单、服务器|网络设备替换工单、服务器|网络设备RMA工单、通用原子工单、硬盘消磁折弯工单、物流工单、资产初入门工单、机柜上下电工单、待盘点|待盘盈工单等等。工单管理系统中要涉及到工单的创建|API创建和维护。所以有必要将一些通用的方法提出来,类似于模块化的架构涉及。

目录:

  1. 日期工具类DateUtil.java提供日期计算的相关静态方法
  2. 接口调用工具类HttpClientUtil.java提供调用外部接口的公共方法
  3. 加密工具类GenMD5Util.java提供了将制定字符串加密成MD5的方法
  4. 公共方法抽象工具类CommonUtil.java提供了对工单表增删改查的公共方法
  5. 获取Bean实例工具类SpringContextUtil.java提供了根据bean id获取Bean实例的方法
  6. 实体Bean和JSON转换工具类JsonToBeanUtil.java提供了json和bean相互转换的方法
  7. 流程工具类FlowUtil.java提供了字符串转换和解析response的常用方法
  8. 文件上传工具类FileUpLoadUtil.java封装了上传的公共方法
  9. 工具类CookieUtil.java提供了常用的操纵缓存的方法
  10. 表格Excel转换实体Bean工具类ExcelUtil.java提供了文件导入导出的方法
  11. 复用$control.setTemplate("web:orderOptList.vm")实现日志记录
  12. JDK反射提供抽象参数类实现动态加载
  13. api auth授权机制保证外部调用接口的安全性

1.日期工具类DateUtil.java提供了常用的日期计算方法,涉及SimpleDateFormat、Calendar、Date三个类,附上代码:

  1 package com.alibaba.tboss.util;
  2
  3 import java.math.BigDecimal;
  4 import java.text.DateFormat;
  5 import java.text.SimpleDateFormat;
  6 import java.util.Calendar;
  7 import java.util.Date;
  8 import java.util.GregorianCalendar;
  9 import java.util.Locale;
 10
 11 import org.apache.commons.lang3.StringUtils;
 12
 13 import com.alibaba.common.lang.StringUtil;
 14 import com.alibaba.nonda.json.ParseException;
 15
 16 public class DateUtil {
 17
 18     public static final String DATE_FORMAT     = "yyyy-MM-dd";
 19     public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
 20     public static final String DATETIME        = "yyyyMMddHHmmss";
 21
 22     /**
 23      * 计算两个日期之间相差的天数
 24      *
 25      * @param smdate 较小的时间
 26      * @param bdate 较大的时间
 27      * @return 相差天数
 28      * @throws ParseException
 29      * @throws Exception
 30      */
 31     public static int daysBetween(Date smdate, Date bdate) {
 32         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 33         try {
 34             smdate = sdf.parse(sdf.format(smdate));
 35             bdate = sdf.parse(sdf.format(bdate));
 36         } catch (java.text.ParseException e) {
 37             e.printStackTrace();
 38         }
 39         Calendar cal = Calendar.getInstance();
 40         cal.setTime(smdate);
 41         long time1 = cal.getTimeInMillis();
 42         cal.setTime(bdate);
 43         long time2 = cal.getTimeInMillis();
 44         long between_days = (time2 - time1) / (1000 * 3600 * 24);
 45         return new BigDecimal(String.valueOf(between_days)).abs().intValue();
 46     }
 47
 48     /**
 49      * @description 将时间字符串转化为Date
 50      * @author Anan
 51      * @time 2013年7月26日 下午7:50:32
 52      * @param time 时间字符串
 53      * @param formatStr 时间格式 如"2013-7-26 19:52:47"、"2013-7-26"
 54      * @return
 55      */
 56     public static Date toDate(String time, String formatStr) {
 57         Date date = null;
 58         DateFormat dateFormat = new SimpleDateFormat(formatStr);
 59         try {
 60             date = dateFormat.parse(time);
 61         } catch (java.text.ParseException e) {
 62             e.printStackTrace();
 63         }
 64         return date;
 65     }
 66
 67     public static Date toDatebyday(String time, String formatStr) {
 68         Date date = null;
 69         DateFormat dateFormat = new SimpleDateFormat(formatStr, Locale.ENGLISH);
 70         try {
 71             date = dateFormat.parse(time);
 72         } catch (java.text.ParseException e) {
 73             e.printStackTrace();
 74         }
 75         return date;
 76     }
 77
 78     public static String toDatebydaytoString(String time, String formatStr) throws java.text.ParseException {
 79         Date date = null;
 80         String dateString = "";
 81         DateFormat dateFormat = new SimpleDateFormat(formatStr, Locale.ENGLISH);
 82
 83         date = dateFormat.parse(time);
 84         dateString = formateDate(date);
 85
 86         return dateString;
 87     }
 88
 89     public static Date toDatebytime(Date time, String formatStr) throws java.text.ParseException {
 90         Date date = null;
 91         String dateString = "";
 92         DateFormat dateFormat = new SimpleDateFormat(formatStr, Locale.ENGLISH);
 93
 94         dateString = formateDate(time);
 95         date = toDate(dateString);
 96
 97         return date;
 98     }
 99
100     /**
101      * @description 将日期转化为字符串
102      * @author Anan
103      * @time 2013年7月30日 下午4:32:30
104      * @param date
105      * @param formatStr
106      * @return
107      */
108     public static String toString(Date date, String formatStr) {
109         if (null == date || StringUtils.isBlank(formatStr)) return "";
110         SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
111         return sdf.format(date);
112     }
113
114     /**
115      * @description 将年月日转化为日期
116      * @author Anan
117      * @time 2013年7月30日 下午5:00:33
118      * @param year
119      * @param month
120      * @param day
121      * @return
122      * @throws java.text.ParseException
123      */
124     public static Date toDate(int year, int month, int day) throws java.text.ParseException {
125         Date date = null;
126         Calendar calender = Calendar.getInstance();
127         calender.set(Calendar.YEAR, year);
128         calender.set(Calendar.MONTH, month - 1);
129         calender.set(Calendar.DATE, day);
130         calender.set(Calendar.HOUR_OF_DAY, 0);
131         calender.set(Calendar.MINUTE, 0);
132         calender.set(Calendar.SECOND, 0);
133         date = calender.getTime();
134         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
135         date = sdf.parse(sdf.format(date));
136         return date;
137     }
138
139     /**
140      * @description 结束日期属于开始日期后的第几个月的日期
141      * @author Anan
142      * @time 2013年8月27日 下午10:00:33
143      * @param startDate 开始日期
144      * @param endDate 结束日期
145      * @return
146      */
147     public static int monthsFromStartDate(Date startDate, Date endDate) {
148         int result = 0;
149         Date temp = null;
150         startDate = toDate(toString(startDate, "yyyy-MM-dd"), "yyyy-MM-dd");
151         endDate = toDate(toString(endDate, "yyyy-MM-dd"), "yyyy-MM-dd");
152         // 开始日期 大于 结束日期 两个日期互换 例如: startDate 2013-05-21 endDate = 2013-04-20
153         if (startDate.after(endDate)) {
154             temp = startDate;
155             startDate = endDate;
156             endDate = temp;
157         }
158         Date tempEndDate1 = null;
159         Date tempEndDate2 = null;
160         int a = getDayOfMonth(startDate);
161         int b = getDayOfMonth(endDate);
162         int c = a - b;
163         Calendar c1 = Calendar.getInstance();
164         Calendar c2 = Calendar.getInstance();
165         c1.setTime(startDate);
166         c2.setTime(endDate);
167         c2.set(Calendar.DAY_OF_MONTH, a);
168         tempEndDate2 = c2.getTime();
169         int i = 0;
170         while (true) {
171             tempEndDate1 = addToMonth(startDate, i);
172             if (tempEndDate1.compareTo(tempEndDate2) == 0) {
173                 result = i;
174                 break;
175             }
176             i++;
177             if (i == 999999999) {// 防止死循环
178                 break;
179             }
180         }
181         if (c < 0) {
182             result = result + 1;
183         }
184         return result;
185     }
186
187     /**
188      * 获取开始时间与结束时间之间间隔的月数
189      *
190      * @author yansong
191      * @param startDate
192      * @param endDate
193      * @return
194      */
195     public static int monthsBetween(Date startDate, Date endDate) {
196         int iMonth = 0;
197         try {
198             Calendar objCalendarDateStart = Calendar.getInstance();
199             objCalendarDateStart.setTime(startDate);
200             Calendar objCalendarDateEnd = Calendar.getInstance();
201             objCalendarDateEnd.setTime(endDate);
202             if (objCalendarDateEnd.equals(objCalendarDateStart) || objCalendarDateStart.after(objCalendarDateEnd)) {
203                 return 0;
204             } else {
205                 if (objCalendarDateEnd.get(Calendar.YEAR) > objCalendarDateStart.get(Calendar.YEAR)) {
206                     iMonth = (objCalendarDateEnd.get(Calendar.YEAR) - objCalendarDateStart.get(Calendar.YEAR)) * 12
207                              + objCalendarDateEnd.get(Calendar.MONTH) - objCalendarDateStart.get(Calendar.MONTH);
208                 } else {
209                     iMonth = objCalendarDateEnd.get(Calendar.MONTH) - objCalendarDateStart.get(Calendar.MONTH);
210                 }
211             }
212
213         } catch (Exception e) {
214             e.printStackTrace();
215         }
216         return iMonth;
217     }
218
219     /**
220      * 获取输入日期所在月份的第一天
221      *
222      * @author yansong
223      * @param date
224      * @return
225      */
226     public static Date getFristDateForCurrentMonth(Date date) {
227         Calendar cal = Calendar.getInstance();
228         cal.setTime(date);
229         cal.set(GregorianCalendar.DAY_OF_MONTH, 1);
230
231         return cal.getTime();
232     }
233
234     /**
235      * 获取输入日期所在月份的最后一天
236      *
237      * @author yansong
238      * @param date
239      * @return
240      */
241     public static Date getLastDateForCurrentMonth(Date date) {
242         Calendar cal = Calendar.getInstance();
243         cal.setTime(date);
244
245         cal.set(Calendar.DATE, 1);
246         cal.roll(Calendar.DATE, -1);
247
248         return cal.getTime();
249     }
250
251     /**
252      * @description 获取某年某月的第一天
253      * @author Anan
254      * @time 2013年7月30日 下午4:27:53
255      * @param year 某年
256      * @param month 某月
257      * @return
258      */
259     public static Date getMonthBegin(int year, int month) {
260         Date _month_begin = null;
261         Calendar calender = Calendar.getInstance();
262         calender.set(Calendar.YEAR, year);
263         calender.set(Calendar.MONTH, month - 1);
264         calender.set(Calendar.DATE, 1);// 把日期设置为当月第一天
265         calender.set(Calendar.HOUR_OF_DAY, 0);
266         calender.set(Calendar.MINUTE, 0);
267         calender.set(Calendar.SECOND, 0);
268         _month_begin = calender.getTime();
269         return _month_begin;
270     }
271
272     /**
273      * @description 获取某年某月的最后一天
274      * @author Anan
275      * @time 2013年7月30日 下午4:28:59
276      * @param year 某年
277      * @param month 某月
278      * @return
279      */
280     public static Date getMonthEnd(int year, int month) {
281         Date month_end = null;
282         Calendar calender = Calendar.getInstance();
283         calender.set(Calendar.YEAR, year);
284         calender.set(Calendar.MONTH, month - 1);
285         calender.set(Calendar.DATE, 1);// 把日期设置为当月第一天
286         calender.roll(Calendar.DATE, -1);// 日期回滚一天,也就是最后一天
287         calender.set(Calendar.HOUR_OF_DAY, 0);
288         calender.set(Calendar.MINUTE, 0);
289         calender.set(Calendar.SECOND, 0);
290         month_end = calender.getTime();
291         return month_end;
292     }
293
294     /**
295      * @description 得到指定月的天数
296      * @author Anan
297      * @time 2013年7月30日 下午4:48:00
298      * @param year 某年
299      * @param month 某月
300      * @return
301      */
302     public static int getMonthLastDay(int year, int month) {
303         Calendar calender = Calendar.getInstance();
304         calender.set(Calendar.YEAR, year);
305         calender.set(Calendar.MONTH, month - 1);
306         calender.set(Calendar.DATE, 1);// 把日期设置为当月第一天
307         calender.roll(Calendar.DATE, -1);// 日期回滚一天,也就是最后一天
308         int maxDate = calender.get(Calendar.DATE);
309         return maxDate;
310     }
311
312     /**
313      * @description 得到当前日期月的天数
314      * @author Anan
315      * @time 2013年9月1日 下午1:01:44
316      * @param date
317      * @return
318      */
319     public static int getMonthLastDay(Date date) {
320         Calendar calender = Calendar.getInstance();
321         calender.setTime(date);
322         calender.set(Calendar.DATE, 1);// 把日期设置为当月第一天
323         calender.roll(Calendar.DATE, -1);// 日期回滚一天,也就是最后一天
324         int maxDate = calender.get(Calendar.DATE);
325         return maxDate;
326     }
327
328     /**
329      * @description 得到日期中的月份
330      * @author William
331      * @time 2013年10月24日 下午1:01:44
332      * @param date
333      * @return
334      */
335     public static int getMonth(Date date) {
336         Calendar calendar = Calendar.getInstance();
337         calendar.setTime(date);
338         return calendar.get(Calendar.MONTH);
339     }
340
341     /**
342      * @description 当月的第几天
343      * @author Anan
344      * @time 2013年8月22日 下午9:24:30
345      * @param date
346      * @return
347      */
348     public static int getDayOfMonth(Date date) {
349         Calendar cal = Calendar.getInstance();
350         cal.setTime(date);
351         return cal.get(Calendar.DAY_OF_MONTH);
352     }
353
354     /**
355      * @description 获得当前日期 + N个月 之后的日期
356      * @author Anan
357      * @time 2013年8月23日 上午12:26:53
358      * @param oldDate
359      * @param n
360      * @return
361      */
362     public static Date addToMonth(Date oldDate, int n) {
363         Date newDate = null;
364         Calendar calOld = Calendar.getInstance();
365         calOld.setTime(oldDate);
366         int month = calOld.get(Calendar.MONTH);
367         Calendar calNew = Calendar.getInstance();
368         calNew.setTime(oldDate);
369         calNew.set(Calendar.MONTH, n + month);
370         newDate = calNew.getTime();
371         return newDate;
372     }
373
374     /**
375      * @description 获得当前日期 减去 N月 之后的日期
376      * @author Anan
377      * @time 2013年9月1日 上午12:26:53
378      * @param oldDate
379      * @param n
380      * @return
381      */
382     public static Date removeMonths(Date oldDate, int n) {
383         Date newDate = null;
384         Calendar calOld = Calendar.getInstance();
385         calOld.setTime(oldDate);
386         int month = calOld.get(Calendar.MONTH);
387         Calendar calNew = Calendar.getInstance();
388         calNew.setTime(oldDate);
389         calNew.set(Calendar.MONTH, month - n);
390         newDate = calNew.getTime();
391         return newDate;
392     }
393
394     /**
395      * @description 获得当前日期 减去 N天 之后的日期
396      * @author Anan
397      * @time 2013年8月23日 上午12:26:53
398      * @param oldDate
399      * @param n
400      * @return
401      */
402     public static Date removeDays(Date oldDate, int n) {
403         Date newDate = null;
404         Calendar calOld = Calendar.getInstance();
405         calOld.setTime(oldDate);
406         int day = calOld.get(Calendar.DAY_OF_YEAR);
407         Calendar calNew = Calendar.getInstance();
408         calNew.setTime(oldDate);
409         calNew.set(Calendar.DAY_OF_YEAR, day - n);
410         newDate = calNew.getTime();
411         return newDate;
412     }
413
414     /**
415      * @description 获得当前日期 加上 N天 之后的日期
416      * @author Anan
417      * @time 2013年8月23日 上午12:26:53
418      * @param oldDate
419      * @param n
420      * @return
421      */
422     public static Date addDays(Date oldDate, int n) {
423         Date newDate = null;
424         Calendar calOld = Calendar.getInstance();
425         calOld.setTime(oldDate);
426         int day = calOld.get(Calendar.DAY_OF_YEAR);
427         Calendar calNew = Calendar.getInstance();
428         calNew.setTime(oldDate);
429         calNew.set(Calendar.DAY_OF_YEAR, day + n);
430         newDate = calNew.getTime();
431         return newDate;
432     }
433
434     /**
435      * @description 获取两个年份之间的差值
436      * @author Anan
437      * @time 2013年8月23日 上午2:28:29
438      * @param startDate
439      * @param endDate
440      * @return
441      */
442     public static int yearsBetween(Date startDate, Date endDate) {
443         int iYears = 0;
444         Calendar calS = Calendar.getInstance();
445         calS.setTime(startDate);
446         Calendar calE = Calendar.getInstance();
447         calE.setTime(endDate);
448         int i = startDate.compareTo(endDate);
449         if (i == 1) {
450             iYears = calS.get(Calendar.YEAR) - calE.get(Calendar.YEAR);
451         } else if (i == -1) {
452             iYears = calE.get(Calendar.YEAR) - calS.get(Calendar.YEAR);
453         }
454         return iYears;
455     }
456
457     /**
458      * @param date 日期
459      * @param offset 偏移量,0为周日 单位为日
460      * @return WeekOfYear
461      */
462     public static int getWeekOfYear(Date date, int offset) {
463         Calendar calendar = Calendar.getInstance();
464         calendar.setTimeInMillis(date.getTime() - offset * 24 * 3600 * 1000L);
465         return calendar.get(Calendar.WEEK_OF_YEAR);
466     }
467
468     // public static void main(String[] args) {
469     // Date now = toDate("2013-1-12", "yyyy-MM-dd");
470     // System.out.println(DateUtil.toString(DateUtil.addDays(now, 2),"yyyy-MM-dd"));
471     // }
472
473     /**
474      * 标准格式化date
475      *
476      * @param date
477      * @return
478      */
479     public static String formateDate(Date date) {
480         if (date == null) {
481             return StringUtil.EMPTY_STRING;
482         }
483
484         return new SimpleDateFormat(DATE_FORMAT).format(date);
485     }
486
487     /**
488      * 标准格式化datetime
489      *
490      * @param date
491      * @return
492      */
493     public static String formateDatetime(Date date) {
494         if (date == null) {
495             return StringUtil.EMPTY_STRING;
496         }
497
498         return new SimpleDateFormat(DATETIME_FORMAT).format(date);
499     }
500
501     /**
502      * 按照"yyyy-MM-dd"的格式转换日期字符串为Date类型
503      *
504      * @param dateStr 日期字符串
505      * @return
506      */
507     public static Date toDate(String dateStr) {
508         Date date = null;
509         DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
510         try {
511             date = dateFormat.parse(dateStr);
512         } catch (java.text.ParseException e) {
513             return null;
514         }
515         return date;
516     }
517
518     public static Date toDateTimes(String dateStr) {
519
520         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
521         String result = null;
522         Date date = null;
523         try {
524             Date strToDate = sdf.parse(dateStr);
525             result = toString(strToDate, DATETIME_FORMAT);
526             date = toDate(result, DATETIME_FORMAT);
527         } catch (java.text.ParseException e) {
528             // TODO Auto-generated catch block
529             e.printStackTrace();
530         }
531         return date;
532
533     }
534
535     public static String toDateTimeCompara(String dateStr) {
536
537         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
538         String result = null;
539
540         try {
541             Date strToDate = sdf.parse(dateStr);
542             result = toString(strToDate, DATETIME_FORMAT);
543
544         } catch (java.text.ParseException e) {
545             // TODO Auto-generated catch block
546             e.printStackTrace();
547         }
548         return result;
549
550     }
551
552     /**
553      * 按照"yyyy-MM-dd HH:mm:ss"的格式转换日期时间字符串为Date类型
554      *
555      * @param dateTimeStr 日期时间字符串
556      * @return
557      */
558     public static Date toDateTime(String dateTimeStr) {
559         Date date = null;
560         DateFormat dateFormat = new SimpleDateFormat(DATETIME_FORMAT);
561         try {
562             date = dateFormat.parse(dateTimeStr);
563         } catch (java.text.ParseException e) {
564             return null;
565         }
566         return date;
567     }
568
569     public static String transferLongToDate(Long millSec) {
570
571         SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT);
572
573         Date date = new Date(millSec);
574
575         return sdf.format(date);
576
577     }
578
579     /**
580      * 校验日期格式是否满足yyyyMMddHHmmss这种格式
581      *
582      * @param time
583      * @return
584      */
585     public static boolean checkValidDate(String time) {
586         boolean ret = true;
587         try {
588             int year = new Integer(time.substring(0, 4)).intValue();
589             int month = new Integer(time.substring(4, 6)).intValue();
590             int date = new Integer(time.substring(6, 8)).intValue();
591             int hourOfDay = new Integer(time.substring(8, 10)).intValue();
592             int minute = new Integer(time.substring(10, 12)).intValue();
593             int second = new Integer(time.substring(12, 14)).intValue();
594             Calendar cal = Calendar.getInstance();
595             cal.setLenient(false); // 允许严格检查日期格式
596             cal.set(year, month - 1, date);
597             cal.set(year, month - 1, date, hourOfDay, minute, second);
598             cal.getTime();// 该方法调用就会抛出异常
599         } catch (Exception e) {
600             e.printStackTrace();
601             ret = false;
602         }
603         return ret;
604     }
605
606     public static void main(String[] args) {
607         String format = "20150819202020";
608         String datestr = "09090909090909";
609         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
610         System.out.println("456" + checkValidDate(datestr));
611         System.out.println("789" + toDateTimes(datestr));
612         System.out.println("123" + toString(toDateTimes(datestr), DATETIME_FORMAT));
613         try {
614             Date strToDate = sdf.parse(format);
615             String result = toString(strToDate, DATETIME_FORMAT);
616             System.out.println("strToDate" + strToDate);
617             System.out.println("strToDate" + result);
618
619         } catch (java.text.ParseException e) {
620             // TODO Auto-generated catch block
621             e.printStackTrace();
622         }
623
624     }
625
626     /**
627      * 获得指定日期的后一天
628      *
629      * @param specifiedDay
630      * @return
631      */
632     public static Date getSpecifiedDayAfter(Date date) {
633         Calendar c = Calendar.getInstance();
634
635         c.setTime(date);
636         int day = c.get(Calendar.DATE);
637         c.set(Calendar.DATE, day + 1);
638
639         String dayAfter = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
640         Date newdate = toDate(dayAfter);
641         return newdate;
642     }
643 }

DateUtil.java

2.工具类HttpClientUtil.java提供了系统调用外部接口的公共方法,包括post、get方法,以及对于HTTPS协议的支持。在httpPostWithJson方法中流的关闭采用了传统的方法,如果项目的JDK版本在1.7之上,可以采用try...with...resources来关闭流。

  1 package com.alibaba.tboss.util;
  2
  3 import java.io.BufferedReader;
  4 import java.io.DataOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.io.InputStreamReader;
  8 import java.io.UnsupportedEncodingException;
  9 import java.net.HttpURLConnection;
 10 import java.net.MalformedURLException;
 11 import java.net.URL;
 12 import java.util.ArrayList;
 13 import java.util.List;
 14 import java.util.Map;
 15
 16 import javax.net.ssl.SSLContext;
 17 import javax.net.ssl.TrustManager;
 18 import javax.net.ssl.X509TrustManager;
 19
 20 import org.apache.commons.lang.StringUtils;
 21 import org.apache.http.HttpEntity;
 22 import org.apache.http.HttpResponse;
 23 import org.apache.http.NameValuePair;
 24 import org.apache.http.client.HttpClient;
 25 import org.apache.http.client.entity.UrlEncodedFormEntity;
 26 import org.apache.http.client.methods.HttpGet;
 27 import org.apache.http.client.methods.HttpPost;
 28 import org.apache.http.conn.scheme.Scheme;
 29 import org.apache.http.conn.ssl.SSLSocketFactory;
 30 import org.apache.http.entity.StringEntity;
 31 import org.apache.http.impl.client.DefaultHttpClient;
 32 import org.apache.http.message.BasicNameValuePair;
 33 import org.apache.http.util.EntityUtils;
 34 import org.slf4j.Logger;
 35 import org.slf4j.LoggerFactory;
 36
 37 import com.alibaba.fastjson.JSONObject;
 38 import com.alibaba.fasttext.sec.url.SSRFChecker;
 39
 40 public class HttpClientUtil {
 41
 42     private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
 43
 44     public static String httpPostWithJson(String ecUrl, String params) {
 45         BufferedReader reader = null;
 46         HttpURLConnection connection = null;
 47         try {
 48             URL url = new URL(ecUrl);
 49             connection = (HttpURLConnection) url.openConnection();
 50             // 创建连接
 51             connection.setDoOutput(true);
 52             connection.setDoInput(true);
 53             connection.setRequestMethod("POST");
 54             connection.setUseCaches(false);
 55             connection.setInstanceFollowRedirects(true);
 56             connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
 57             connection.connect();
 58
 59             // POST请求
 60             DataOutputStream out = new DataOutputStream(connection.getOutputStream());
 61             out.writeBytes(params);
 62             out.flush();
 63             out.close();
 64
 65             // 读取响应
 66             reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
 67             String lines;
 68             StringBuffer sb = new StringBuffer("");
 69             while ((lines = reader.readLine()) != null) {
 70                 lines = new String(lines.getBytes(), "utf-8");
 71                 sb.append(lines);
 72             }
 73             return sb.toString();
 74         } catch (MalformedURLException e) {
 75             logger.error("httpPostWithJsonMalformedURLException error", e);
 76             e.printStackTrace();
 77         } catch (UnsupportedEncodingException e) {
 78             logger.error("httpPostWithJsonUnsupportedEncodingException error", e);
 79             e.printStackTrace();
 80         } catch (IOException e) {
 81             logger.error("httpPostWithJsonIOException error", e);
 82             e.printStackTrace();
 83         } finally {
 84             try {
 85                 if (null != reader) {
 86                     reader.close();
 87                 }
 88                 if (null != connection) {
 89                     connection.disconnect();
 90                 }
 91             } catch (IOException e) {
 92                 e.printStackTrace();
 93             }
 94         }
 95         return null;
 96     }
 97
 98     public static String HttpPostWithJsonByHttpClient(String url, String json) {
 99         HttpClient client = new DefaultHttpClient();
100         HttpPost post = new HttpPost(url);
101         try {
102             StringEntity s = new StringEntity(json);
103             s.setContentEncoding("UTF-8");
104             s.setContentType("application/json");
105             post.setEntity(s);
106
107             HttpResponse response = client.execute(post);
108             // 读取内容
109             String result = extractContent(response);
110             return result;
111         } catch (Exception e) {
112             logger.error("HttpPostWithJsonByHttpClientException error", e);
113             return null;
114         }
115     }
116
117     public static String httpPostRequest(String url, Map<String, String> params) throws Exception {
118         HttpClient httpclient = new DefaultHttpClient();
119         HttpPost httpPost = new HttpPost(url);
120         httpPost.setHeader("ContentType", "application/x-www-form-urlencoded;charset=UTF-8");
121         List<NameValuePair> parameters = new ArrayList<NameValuePair>();
122         for (String key : params.keySet()) {
123             parameters.add(new BasicNameValuePair(key, params.get(key)));
124         }
125         // 创建UrlEncodedFormEntity对象
126         UrlEncodedFormEntity formEntiry = new UrlEncodedFormEntity(parameters, "UTF-8");
127         httpPost.setEntity(formEntiry);
128
129         HttpResponse response = httpclient.execute(httpPost);
130         String html = extractContent(response);
131         return html;
132     }
133
134     public static String httpGetRequest(String url) throws Exception {
135         HttpClient httpclient = new DefaultHttpClient();
136
137         // 使用安全包进行检查是否安全
138         SSRFChecker ssrfChecker = SSRFChecker.instance;
139         if (!ssrfChecker.checkUrlWithoutConnection(url)) {
140             logger.error("HttpClientUtils SSRFCheck Errors ", url);
141             throw new RuntimeException("SSRFChecker fail, url=[" + url + "]");
142         }
143
144         HttpPost httpGet = new HttpPost(url);
145         httpGet.setHeader("ContentType", "application/x-www-form-urlencoded;charset=UTF-8");
146         // 创建UrlEncodedFormEntity对象
147         HttpResponse response = httpclient.execute(httpGet);
148         String html = extractContent(response);
149         return html;
150     }
151
152     private static String extractContent(HttpResponse response) throws Exception {
153         String htmStr = null;
154         if (response.getStatusLine().getStatusCode() == 200) {
155             if (response != null) {
156                 HttpEntity entity = response.getEntity();
157                 InputStream ins = entity.getContent();
158                 BufferedReader br = new BufferedReader(new InputStreamReader(ins, "UTF-8"));
159                 StringBuffer sbf = new StringBuffer();
160                 String line = null;
161                 while ((line = br.readLine()) != null) {
162                     sbf.append(line);
163                 }
164                 // 处理内容
165                 htmStr = sbf.toString();
166             }
167         }
168         return htmStr;
169     }
170
171     /**
172      * 实现HTTPS的API访问
173      *
174      * @param sn
175      * @param nodegroup
176      * @param traceInfo
177      * @return
178      */
179     public static boolean httpsPostRequest(String url, Map<String, Object> params) {
180
181         DefaultHttpClient httpClient = new DefaultHttpClient();
182         try {
183             TrustManager easyTrustManager = new X509TrustManager() {
184
185                 @Override
186                 public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
187                                                                                                                throws java.security.cert.CertificateException {
188                 }
189
190                 @Override
191                 public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
192                                                                                                                throws java.security.cert.CertificateException {
193                 }
194
195                 @Override
196                 public java.security.cert.X509Certificate[] getAcceptedIssuers() {
197                     return new java.security.cert.X509Certificate[0]; // To change body of implemented methods use File
198                                                                       // | Settings | File Templates.
199                 }
200             };
201
202             SSLContext sslcontext = SSLContext.getInstance("TLS");
203             sslcontext.init(null, new TrustManager[] { easyTrustManager }, null);
204             SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
205             Scheme sch = new Scheme("https", 443, sf);
206             httpClient.getConnectionManager().getSchemeRegistry().register(sch);
207
208             HttpPost httpPost = new HttpPost(url);
209             List<NameValuePair> parameters = new ArrayList<NameValuePair>();
210             for (String key : params.keySet()) {
211                 if (params.get(key) != null) {
212                     parameters.add(new BasicNameValuePair(key, params.get(key).toString()));
213                 }
214             }
215             UrlEncodedFormEntity formEntiry = new UrlEncodedFormEntity(parameters, "UTF-8");
216
217             httpPost.setEntity(formEntiry);
218
219             HttpResponse response = httpClient.execute(httpPost);
220             HttpEntity entity = response.getEntity();
221             String content = EntityUtils.toString(entity);
222             if (content != null) {
223                 JSONObject jo = JSONObject.parseObject(content);
224                 if (jo.getBooleanValue("content")) {
225                     return true;
226                 }
227             }
228             return false;
229         } catch (Exception e) {
230             throw new RuntimeException(e.getMessage(), e);
231         } finally {
232             httpClient.getConnectionManager().shutdown();
233         }
234     }
235
236     public static JSONObject httpsPostRequestString(String url, Map<String, Object> params) {
237
238         DefaultHttpClient httpClient = new DefaultHttpClient();
239         String content = "";
240         try {
241             TrustManager easyTrustManager = new X509TrustManager() {
242
243                 @Override
244                 public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
245                                                                                                                throws java.security.cert.CertificateException {
246                 }
247
248                 @Override
249                 public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
250                                                                                                                throws java.security.cert.CertificateException {
251                 }
252
253                 @Override
254                 public java.security.cert.X509Certificate[] getAcceptedIssuers() {
255                     return new java.security.cert.X509Certificate[0]; // To change body of implemented methods use File
256                                                                       // | Settings | File Templates.
257                 }
258             };
259
260             SSLContext sslcontext = SSLContext.getInstance("TLS");
261             sslcontext.init(null, new TrustManager[] { easyTrustManager }, null);
262             SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
263             Scheme sch = new Scheme("https", 443, sf);
264             httpClient.getConnectionManager().getSchemeRegistry().register(sch);
265
266             HttpPost httpPost = new HttpPost(url);
267             List<NameValuePair> parameters = new ArrayList<NameValuePair>();
268             for (String key : params.keySet()) {
269                 if (params.get(key) != null) {
270                     parameters.add(new BasicNameValuePair(key, params.get(key).toString()));
271                 }
272             }
273             UrlEncodedFormEntity formEntiry = new UrlEncodedFormEntity(parameters, "UTF-8");
274
275             httpPost.setEntity(formEntiry);
276
277             HttpResponse response = httpClient.execute(httpPost);
278             HttpEntity entity = response.getEntity();
279             content = EntityUtils.toString(entity);
280             if (content != null) {
281                 JSONObject jo = JSONObject.parseObject(content);
282                 return jo;
283             }
284             return null;
285         } catch (Exception e) {
286             logger.error("httpsPostRequestString [url={},params={},response={}] error:", url,
287                          JSONObject.toJSONString(params), content, e);
288             throw new RuntimeException(e.getMessage(), e);
289         } finally {
290             httpClient.getConnectionManager().shutdown();
291         }
292     }
293
294     public static String httpsGetByHttpclient(String url, String authorization) {
295
296         DefaultHttpClient httpClient = new DefaultHttpClient();
297         try {
298             TrustManager easyTrustManager = new X509TrustManager() {
299
300                 @Override
301                 public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
302                                                                                                                throws java.security.cert.CertificateException {
303                 }
304
305                 @Override
306                 public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
307                                                                                                                throws java.security.cert.CertificateException {
308                 }
309
310                 @Override
311                 public java.security.cert.X509Certificate[] getAcceptedIssuers() {
312                     return new java.security.cert.X509Certificate[0]; // To change body of implemented methods use File
313                                                                       // | Settings | File Templates.
314                 }
315             };
316
317             SSLContext sslcontext = SSLContext.getInstance("TLS");
318             sslcontext.init(null, new TrustManager[] { easyTrustManager }, null);
319             SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
320             Scheme sch = new Scheme("https", 443, sf);
321             httpClient.getConnectionManager().getSchemeRegistry().register(sch);
322
323             // 使用安全包进行检查是否安全
324             SSRFChecker ssrfChecker = SSRFChecker.instance;
325             if (!ssrfChecker.checkUrlWithoutConnection(url)) {
326                 logger.error("HttpClientUtils SSRFCheck Errors ", url);
327                 throw new RuntimeException("SSRFChecker fail, url=[" + url + "]");
328             }
329
330             HttpGet httpGet = new HttpGet(url);
331             httpGet.setHeader("Authorization", authorization);
332
333             HttpResponse response = httpClient.execute(httpGet);
334             String content = extractContent(response);
335             if (StringUtils.isBlank(content)) {
336                 return "";
337             }
338             return content;
339         } catch (Exception e) {
340             throw new RuntimeException(e.getMessage(), e);
341         } finally {
342             httpClient.getConnectionManager().shutdown();
343         }
344     }
345
346     /**
347      * https post 方式,包含Authorization认证
348      *
349      * @param url
350      * @param params
351      * @param authorization
352      * @return
353      */
354     public static String httpsPostByHttpclient(String url, Map<String, Object> params, String authorization) {
355         DefaultHttpClient httpClient = new DefaultHttpClient();
356         try {
357             TrustManager easyTrustManager = new X509TrustManager() {
358
359                 @Override
360                 public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
361                                                                                                                throws java.security.cert.CertificateException {
362                 }
363
364                 @Override
365                 public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
366                                                                                                                throws java.security.cert.CertificateException {
367                 }
368
369                 @Override
370                 public java.security.cert.X509Certificate[] getAcceptedIssuers() {
371                     return new java.security.cert.X509Certificate[0]; // To change body of implemented methods use File
372                                                                       // | Settings | File Templates.
373                 }
374             };
375
376             SSLContext sslcontext = SSLContext.getInstance("TLS");
377             sslcontext.init(null, new TrustManager[] { easyTrustManager }, null);
378             SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
379             Scheme sch = new Scheme("https", 443, sf);
380             httpClient.getConnectionManager().getSchemeRegistry().register(sch);
381
382             HttpPost httpPost = new HttpPost(url);
383             httpPost.setHeader("Authorization", authorization);
384             List<NameValuePair> parameters = new ArrayList<NameValuePair>();
385             for (String key : params.keySet()) {
386                 if (params.get(key) != null) {
387                     parameters.add(new BasicNameValuePair(key, params.get(key).toString()));
388                 }
389             }
390             UrlEncodedFormEntity formEntiry = new UrlEncodedFormEntity(parameters, "UTF-8");
391
392             httpPost.setEntity(formEntiry);
393
394             HttpResponse response = httpClient.execute(httpPost);
395             String content = extractContent(response);
396             if (StringUtils.isBlank(content)) {
397                 return "";
398             }
399             return content;
400         } catch (Exception e) {
401             throw new RuntimeException(e.getMessage(), e);
402         } finally {
403             httpClient.getConnectionManager().shutdown();
404         }
405     }
406
407 }

HttpClientUtil.java

3.加密工具类GenMD5Util.java提供了将指定字符串加密成MD5的方法。代码实现如下:

 1 package com.alibaba.tboss.util;
 2
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5
 6 public class GenArmoryKeyUtil {
 7
 8     private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
 9
10     public static void main(String[] args) {
11         Date today = new Date();
12         String username = "idcm";
13         /* 开发环境和线上环境最好配置不一样的key */
14         String key = "dNdljpq05K0a62htckqXnQ==";
15         String sign = getKey(username, today, key);
16         System.out.println(sign);
17     }
18
19     public static String getKey(String username, Date today, String key) {
20         return getMD5(username + SIMPLE_DATE_FORMAT.format(today) + key);
21     }
22
23     public static String getMD5(String value) {
24         String result = "";
25         try {
26             result = getMD5(value.getBytes("UTF-8"));
27         } catch (Exception e) {
28             System.out.println(e.getMessage());
29         }
30         return result;
31     }
32
33     public static String getMD5(byte[] bytes) {
34         char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
35         char str[] = new char[16 * 2];
36         try {
37             java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
38             md.update(bytes);
39             byte tmp[] = md.digest();
40             int k = 0;
41             for (int i = 0; i < 16; i++) {
42                 byte byte0 = tmp[i];
43                 str[k++] = hexDigits[byte0 >>> 4 & 0xf];
44                 str[k++] = hexDigits[byte0 & 0xf];
45             }
46         } catch (Exception e) {
47             System.out.println(e.getMessage());
48         }
49         return new String(str);
50     }
51
52 }

GenMD5Util.java

4.在工单表中有公共属性:`creator`、'gmt_create'、`modifier`、`gmt_modified`、`is_deleted`,公共方法抽象工具类CommonUtil.java提供了对基础工单表的公共操作方法,在工单操作中将新建工单,修改工单,设置通用值的方法提取出来,利用java反射来实现设值。代码如下:

  1 package com.alibaba.tboss.common.auth.common;
  2
  3 import java.lang.reflect.Method;
  4 import java.util.Date;
  5 import java.util.Map;
  6 import java.util.regex.Matcher;
  7 import java.util.regex.Pattern;
  8
  9 import org.apache.commons.lang.StringUtils;
 10
 11 import com.alibaba.tboss.common.auth.costants.AppRoleType;
 12 import com.alibaba.tboss.common.auth.exception.AppAuthCommonException;
 13 import com.alibaba.tboss.common.auth.privilege.PrivilegeInfo;
 14
 15 public class CommonUtil {
 16
 17     private static String MODIFIER      = "modifier";
 18
 19     private static String GMT_MODIFIED  = "gmtModified";
 20
 21     private static String IS_DELETED    = "is_deleted";
 22
 23     private static String FULL_ORG_PATH = "fullOrgPath";
 24
 25     private static String OWNER         = "owner";
 26
 27     public static void setCommonValueForCreate(Object pojo, PrivilegeInfo privilegeInfo) {
 28         try {
 29             Method setCreator = pojo.getClass().getMethod("setCreator", String.class);
 30             setCreator.invoke(pojo, getOperator(privilegeInfo));
 31
 32             Method setModifier = pojo.getClass().getMethod("setModifier", String.class);
 33             setModifier.invoke(pojo, getOperator(privilegeInfo));
 34
 35             Method setGmtCreate = pojo.getClass().getMethod("setGmtCreate", Date.class);
 36             setGmtCreate.invoke(pojo, new Date());
 37
 38             Method setGmtModified = pojo.getClass().getMethod("setGmtModified", Date.class);
 39             setGmtModified.invoke(pojo, new Date());
 40
 41             Method setIsDeleted = pojo.getClass().getMethod("setIsDeleted", String.class);
 42             setIsDeleted.invoke(pojo, "n");
 43
 44         } catch (Exception e) {
 45             throw new AppAuthCommonException("invoke method error ", e);
 46         }
 47
 48     }
 49
 50     public static void setCommonValueForDeletes(Object pojo, PrivilegeInfo privilegeInfo) {
 51         try {
 52             Method setModifier = pojo.getClass().getMethod("setModifier", String.class);
 53             setModifier.invoke(pojo, getOperator(privilegeInfo));
 54
 55             Method setGmtModified = pojo.getClass().getMethod("setGmtModified", Date.class);
 56             setGmtModified.invoke(pojo, new Date());
 57
 58             Method setIsDeleted = pojo.getClass().getMethod("setIsDeleted", String.class);
 59             setIsDeleted.invoke(pojo, "y");
 60         } catch (Exception e) {
 61             throw new AppAuthCommonException("invoke method error ", e);
 62         }
 63     }
 64
 65     public static void setCommonValueForDelete(Map<String, Object> param, PrivilegeInfo privilegeInfo) {
 66         if (param.get(MODIFIER) == null || StringUtils.isEmpty((String) param.get(MODIFIER))) {
 67             param.put(MODIFIER, getOperator(privilegeInfo));
 68         }
 69         param.put(GMT_MODIFIED, new Date());
 70         param.put(IS_DELETED, "n");
 71
 72     }
 73
 74     public static void setCommonValueForUpdate(Object pojo, PrivilegeInfo privilegeInfo) {
 75         try {
 76             Method setGmtModified = pojo.getClass().getMethod("setGmtModified", Date.class);
 77             setGmtModified.invoke(pojo, new Date());
 78             Method setModifier = pojo.getClass().getMethod("setModifier", String.class);
 79             setModifier.invoke(pojo, getOperator(privilegeInfo));
 80
 81         } catch (Exception e) {
 82             throw new AppAuthCommonException("invoke method error ", e);
 83         }
 84
 85     }
 86
 87     public static void setCommonValueForUpdate(Map<String, Object> param, PrivilegeInfo privilegeInfo) {
 88         if (param.get(MODIFIER) == null || StringUtils.isEmpty((String) param.get(MODIFIER))) {
 89             param.put(MODIFIER, getOperator(privilegeInfo));
 90         }
 91         param.put(GMT_MODIFIED, new Date());
 92     }
 93
 94     public static void setOrgPathForSelectMap(Map<String, Object> param, PrivilegeInfo privilegeInfo) {
 95         if (privilegeInfo.getCurrentRoleType().equals(AppRoleType.MASTER.toString())) {
 96             if (param.get(FULL_ORG_PATH) == null || StringUtils.isEmpty((String) param.get(FULL_ORG_PATH))) {
 97                 param.put(FULL_ORG_PATH, getCurrentDataAuthAccessPath(privilegeInfo));
 98             }
 99         } else {
100             if (param.get(OWNER) == null || StringUtils.isEmpty((String) param.get(OWNER))) {
101                 param.put(OWNER, privilegeInfo.getAppUserId());
102             }
103         }
104
105     }
106
107     private static String getCurrentDataAuthAccessPath(PrivilegeInfo pvgInfo) {
108         if (pvgInfo == null || StringUtils.isEmpty(pvgInfo.getCurrentDataAuthAccessPath())) {
109             return "1/2";
110         } else {
111             return pvgInfo.getCurrentDataAuthAccessPath();
112         }
113     }
114
115     public static String getOperator(PrivilegeInfo pvgInfo) {
116         if (pvgInfo == null || StringUtils.isEmpty(pvgInfo.getWorkNo())) {
117             return "SYSTEM";
118         } else {
119             return pvgInfo.getWorkNo();
120         }
121     }
122
123     public static boolean numStart(String workNo) {
124         Pattern pattern = Pattern.compile("^(\\d+)(.*)");
125         Matcher matcher = pattern.matcher(workNo);
126         return matcher.matches();
127     }
128
129     public static String preprWorkNo(String workNo) {
130         if (StringUtils.isEmpty(workNo)) {
131             return workNo;
132         }
133         if (numStart(workNo) && workNo.length() < 6) {
134             while (workNo.length() < 6) {
135                 workNo = "0" + workNo;
136             }
137         }
138         return workNo;
139     }
140
141 }

CommonUtil.java

5.当spring容器启动的时候,自动把实现了ApplicationContextAware的类找出来,然后为其注入ApplicationContext属性,使得SpringContextUtil可以自由自在的根据名字获取Bean实例。当需要手动获取Bean实例时,就可以直接使用工具类来获取。

package com.alibaba.tboss.util;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;/*** * ClassName: SpringContextUtil <br/>* Function: 在applicationContext.xml中加入配置 *           <bean id="SpringContextUtil" class="com.alibaba.tboss.util.SpringContextUtil"/>*           用来得到spring配置的Bean <br/>* date: 2015年12月31日 <br/>*/
public class SpringContextUtil implements ApplicationContextAware {  private static ApplicationContext applicationContext;     //Spring应用上下文环境  /** * 实现ApplicationContextAware接口的回调方法,设置上下文环境    * @param applicationContext * @throws BeansException */  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  SpringContextUtil.applicationContext = applicationContext;  }  /** * @return ApplicationContext */  public static ApplicationContext getApplicationContext() {  return applicationContext;  }  /** * 获取对象    * @param name * @return Object 一个以所给名字注册的bean的实例 * @throws BeansException */  public static Object getBean(String name) throws BeansException {  return applicationContext.getBean(name);  } /*** * getBean: 获取类型为requiredType的对象 . <br/>** @param requiredType 返回对象类型 * @return 返回requiredType类型对象 */public static <T> T getBean(Class<T> requiredType) {return applicationContext.getBean(requiredType);}/** * 获取类型为requiredType的对象 * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException) * @param name       bean注册名 * @param requiredType 返回对象类型 * @return Object 返回requiredType类型对象 * @throws BeansException */
public static <T> T getBean(String name, Class<T> requiredType) throws BeansException {  return applicationContext.getBean(name, requiredType);  }  /** * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true  * @param name * @return boolean */  public static boolean containsBean(String name) {  return applicationContext.containsBean(name);  }  /** * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)    * @param name * @return boolean * @throws NoSuchBeanDefinitionException */  public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {  return applicationContext.isSingleton(name);  }  /** * @param name * @return Class 注册对象的类型 * @throws NoSuchBeanDefinitionException */  @SuppressWarnings("rawtypes")
public static Class getType(String name) throws NoSuchBeanDefinitionException {  return applicationContext.getType(name);  }  /** * 如果给定的bean名字在bean定义中有别名,则返回这些别名    * @param name * @return * @throws NoSuchBeanDefinitionException */  public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {  return applicationContext.getAliases(name);  }  }  

SpringContextUtil.java

6.项目中常用的数据类型转换中,工具类JsonToBeanUtil.java提供了json和bean相互转换的方法,主要支持gson和fastjson。

package com.alibaba.tboss.util;import java.util.ArrayList;
import java.util.List;import com.alibaba.fastjson.JSONArray;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;@SuppressWarnings({ "unchecked", "rawtypes" })
public class JsonToBeanUtil {/*** 使用com.alibaba.fastjson.JSONArray.parseArray()方法,将json转List<Bean>*/public static List<?> JsonToJavaBean(String json, Class objectClass) {List<?> list = new ArrayList();if (json != null && !"".equals(json)) {try {list = JSONArray.parseArray(json, objectClass);} catch (Exception e) {e.printStackTrace();}}return list;}/*** 使用 com.google.gson.Gson.fromJson将json转Bean*/public static <T> T jsonToBean(String jsonString, Class<T> beanCalss) {Gson gson = new Gson();T bean = gson.fromJson(jsonString, beanCalss);return bean;}public static <T> T jsonToBean(String jsonString, Class<T> beanCalss, String dateFormat) {Gson gson = new GsonBuilder().setDateFormat(dateFormat).create();T bean = gson.fromJson(jsonString, beanCalss);return bean;}/*** 使用 com.google.gson.Gson.fromJson将list转JSON*/public static String listToJson(List<?> list) {Gson gson = new Gson();String s = gson.toJson(list);return s;}public static String listToJsonWithoutHtmlEscaping(List<?> list) {Gson gson = new GsonBuilder().disableHtmlEscaping().create();String s = gson.toJson(list);return s;}
}

JsonToBeanUtil.java

7.流程工具类FlowUtil.java,实现了字符串的不同编解码,调用post请求解析response数据。代码如下:

package com.alibaba.tboss.biz.flow.util;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import net.sf.json.JSONObject;import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;public class FlowUtil {public static String emptyString = StringUtils.EMPTY;/*** 实体类Bean转JSON*/@SuppressWarnings("static-access")public static String ObjectToJSON(Object obj, String key) {if (obj != null) {JSONObject jsonObject = new JSONObject().fromObject(obj);if (!"".equals(key) && key != null) {return "{" + key + ":" + jsonObject.toString() + "}";}return jsonObject.toString();}return emptyString;}/*** <p>* javaEncodeString TODO(转码)* </p>* * @param v 转换字符串* @param charset 转换格式* @return String 设定文件*/public static String javaEncodeString(String v, String charset) {try {return URLEncoder.encode(v, charset);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return v;}/*** <p>* javaDecodeString TODO(解码)* </p>* * @param v 转换字符串* @param charset 转换格式* @return String 设定文件*/public static String javaDecodeString(String v, String charset) {try {return URLDecoder.decode(v, charset);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return v;}/*** 获取HttpResponse 对象内容*/public static String extractContent(HttpResponse response) throws Exception {String htmStr = "";if (response != null) {HttpEntity entity = response.getEntity();InputStream ins = entity.getContent();BufferedReader br = null;StringBuffer sbf = new StringBuffer();try {br = new BufferedReader(new InputStreamReader(ins, "UTF-8"));String line = null;while ((line = br.readLine()) != null) {sbf.append(line);}} finally {if (br != null) {br.close();}}// 处理内容htmStr = sbf.toString();}return htmStr;}/*** <p>* 获取请求的数据* </p>* * @param url* @param params* @return* @throws Exception 参数描述*/public static String httpPostRequest(String url, List<NameValuePair> params) throws Exception {HttpClient httpclient = new DefaultHttpClient();HttpPost httpPost = new HttpPost(url);// 创建UrlEncodedFormEntity对象UrlEncodedFormEntity formEntiry = new UrlEncodedFormEntity(params, "UTF-8");httpPost.setEntity(formEntiry);HttpResponse response = httpclient.execute(httpPost);String html = extractContent(response);return html;}/*** <p>* 获取请求的数据* </p>* * @param url* @param params* @return* @throws Exception 参数描述*/public static String httpPostRequest(String url, HashMap<String, String> params) throws Exception {HttpClient httpclient = new DefaultHttpClient();HttpPost httpPost = new HttpPost(url);List<NameValuePair> parameters = new ArrayList<NameValuePair>();for (String key : params.keySet()) {parameters.add(new BasicNameValuePair(key, params.get(key)));}// 创建UrlEncodedFormEntity对象UrlEncodedFormEntity formEntiry = new UrlEncodedFormEntity(parameters, "UTF-8");httpPost.setEntity(formEntiry);HttpResponse response = httpclient.execute(httpPost);String html = extractContent(response);return html;}
}

FlowUtil.java

8.文件上传工具类FileUpLoadUtil.java提供了文件上传的常用方法。

package com.alibaba.tboss.util;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import com.alibaba.tboss.common.idcFree.util.RackUtil;
import com.alibaba.tboss.dal.mysql.location.LocationCorrect;
import com.alibaba.tboss.dal.mysql.rack.RackCorrect;
import com.alibaba.tboss.exception.ErrorCode;
import com.alibaba.tboss.exception.ServiceException;
import com.alibaba.tboss.util.ExcelUtils.CellMapping;public class FileUpLoadUtil {public static <T> List<T> importFile(FileItem fileInput, String sheetName, Class<T> type) {List<T> list = null;if (null == fileInput) {throw new ServiceException(ErrorCode.Params_Lost, "机柜导入文件");}Workbook wb = null;InputStream is = null;Sheet sheet = null;try {is = fileInput.getInputStream();wb = new XSSFWorkbook(is);sheet = wb.getSheet(sheetName);} catch (Exception e) {throw new ServiceException(ErrorCode.Upload_File_Error, "上传excel版本文件解析失败");} finally {if (is != null) {try {is.close();} catch (IOException e) {}}}if (sheet != null) {// 初始化Excel栏目List<CellMapping> mappingList = RackUtil.getLocationCorrectColumns();try {list = ExcelUtils.excel2bean(sheet, type, mappingList);} catch (Exception e) {throw new ServiceException(ErrorCode.Upload_File_Error, "Excel解析失败");}} else {throw new ServiceException(ErrorCode.Upload_File_Error, "未找到模板对应sheet");}return list;}public static <T> List<T> importFileRack(FileItem fileInput, String sheetName, Class<T> type) {List<T> list = null;if (null == fileInput) {throw new ServiceException(ErrorCode.Params_Lost, "机柜导入文件");}Workbook wb = null;InputStream is = null;Sheet sheet = null;try {is = fileInput.getInputStream();wb = new XSSFWorkbook(is);sheet = wb.getSheet(sheetName);} catch (Exception e) {throw new ServiceException(ErrorCode.Upload_File_Error, "上传excel版本文件解析失败");} finally {if (is != null) {try {is.close();} catch (IOException e) {}}}if (sheet != null) {// 初始化Excel栏目List<CellMapping> mappingList = RackUtil.getRackCorrectColumns();try {list = ExcelUtils.excel2bean(sheet, type, mappingList);} catch (Exception e) {throw new ServiceException(ErrorCode.Upload_File_Error, "Excel解析失败");}} else {throw new ServiceException(ErrorCode.Upload_File_Error, "未找到模板对应sheet");}return list;}/*** 导出文件*/public static void exportTemplate(List<LocationCorrect> locationCorrect, List<CellMapping> mappingList,String fileName, String sheetName, HttpServletResponse response) {OutputStream out = null;try {response.setHeader("Pragma", "public");// 解决IE浏览器在https模式下文件无法下载response.setHeader("Cache-Control", "max-age=0");// 解决IE浏览器在https模式下文件无法下载// 解决safari中下载会自动添加html后缀的问题response.setHeader("Content-Type", "application/vnd.ms-excel");response.setDateHeader("Expires", 0);// 添加*=utf-8'解决中文文件名在firefox和safari中乱码的问题.response.setHeader("Content-Disposition","attachment; filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8"));out = response.getOutputStream();exportFileAsExcel(locationCorrect, mappingList, sheetName, out);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("导出异常:" + e.getMessage(), e);} finally {if (out != null) try {out.close();} catch (IOException e) {out = null;throw new RuntimeException("导出异常:" + e.getMessage(), e);}}// 成功后返回cookie标志位response.setHeader("SET-COOKIE", "fileDownload=true;Path=/;");}/*** 导出文件*/public static void exportRackTemplate(List<RackCorrect> locationCorrect, List<CellMapping> mappingList,String fileName, String sheetName, HttpServletResponse response) {OutputStream out = null;try {response.setHeader("Pragma", "public");// 解决IE浏览器在https模式下文件无法下载response.setHeader("Cache-Control", "max-age=0");// 解决IE浏览器在https模式下文件无法下载// 解决safari中下载会自动添加html后缀的问题response.setHeader("Content-Type", "application/vnd.ms-excel");response.setDateHeader("Expires", 0);// 添加*=utf-8'解决中文文件名在firefox和safari中乱码的问题.response.setHeader("Content-Disposition","attachment; filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8"));out = response.getOutputStream();exportFileAsExcel(locationCorrect, mappingList, sheetName, out);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("导出异常:" + e.getMessage(), e);} finally {if (out != null) try {out.close();} catch (IOException e) {out = null;throw new RuntimeException("导出异常:" + e.getMessage(), e);}}// 成功后返回cookie标志位response.setHeader("SET-COOKIE", "fileDownload=true;Path=/;");}/*** 导出机柜列表为Excel文件* * @param datas 导出的机柜列表* @param mappingList 导出的字段* @param out 导出文件输出流* @param sheetName 导出Excel的sheet名称*/public static void exportFileAsExcel(List<?> datas, List<CellMapping> mappingList, String sheetName,OutputStream out) {try {// XSSFWorkbookXSSFWorkbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet(sheetName);ExcelUtils.bean2excel(datas, sheet, mappingList);workbook.write(out);} catch (Exception e) {throw new RuntimeException("导出Excel时发生错误:" + e.getStackTrace(), e);}}
}

FileUploadUtil.java

9.缓存工具类CookieUtil.java文件提供了操作缓存的常用方法

package com.alibaba.tboss.util;import java.text.FieldPosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;/*** 类CookieUtil.java的实现描述:操作Cookie的工具类* * @author chivas.liuzh 12 Jun 2011 9:30:14 PM*/
public class CookieUtil {private static final String PATH = "/";/*** US locale - all HTTP dates are in english*/public final static Locale LOCALE_US = Locale.US;/*** Pattern used for old cookies*/public final static String OLD_COOKIE_PATTERN = "EEE, dd-MMM-yyyy HH:mm:ss z";//// from RFC 2068, token special case characters//
    private static final String tspecials = "()<>@,;:\\\"/[]?={} \t";private static boolean checkFlag[] = new boolean[127];static {for (int i = 0; i < tspecials.length(); i++) {checkFlag[tspecials.charAt(i)] = true;}}public static String getCookieValue(String key, HttpServletRequest request) {Cookie cookie = getCookie(key, request);if (cookie == null)return null;return cookie.getValue();}public static Cookie getCookie(String key, HttpServletRequest request) {if (request == null)return null;Cookie[] cookies = request.getCookies();if (cookies == null)return null;Cookie value = null;for (Cookie c : cookies) {if (key.equals(c.getName())) {value = c;break;}}return value;}public static void addCookie(String key, String value,HttpServletResponse response) {setCookie(key, value, -1, null, null, response);}public static void addCookie(String key, String value,final boolean httpOnly, HttpServletResponse response) {setCookie(key, value, -1, null, null, httpOnly, response);}public static void addCookie(String key, String value,final boolean httpOnly, final boolean secure,HttpServletResponse response) {setCookie(key, value, -1, null, null, httpOnly, secure, response);}public static void addCookie(String key, String value, int maxAge,HttpServletResponse response) {setCookie(key, value, maxAge, null, null, response);}public static void addCookie(String key, String value, int maxAge,final boolean httpOnly, HttpServletResponse response) {setCookie(key, value, maxAge, null, null, httpOnly, response);}public static void addCookie(String key, String value, int maxAge,final boolean httpOnly, final boolean secure,HttpServletResponse response) {setCookie(key, value, maxAge, null, null, httpOnly, secure, response);}public static void addCookie(String key, String value, int maxAge,String path, String domainName, HttpServletResponse response) {setCookie(key, value, maxAge, path, domainName, response);}public static void addCookie(String key, String value, int maxAge,String path, String domainName, final boolean httpOnly,HttpServletResponse response) {setCookie(key, value, maxAge, path, domainName, httpOnly, response);}public static void addCookie(String key, String value, int maxAge,String path, String domainName, final boolean httpOnly,final boolean secure, HttpServletResponse response) {setCookie(key, value, maxAge, path, domainName, httpOnly, secure,response);}public static void removeCookie(String key, HttpServletResponse response) {removeCookie(key, null, null, response);}public static void removeCookie(String key, String path, String domainName,HttpServletResponse response) {setCookie(key, StringUtils.EMPTY, 0, path, domainName, false, response);}private static void setCookie(String key, String value, int maxAge,String path, String domainName, HttpServletResponse response) {setCookie(key, value, maxAge, path, domainName, false, false, response);}private static void setCookie(String key, String value, int maxAge,String path, String domainName, final boolean httpOnly,HttpServletResponse response) {setCookie(key, value, maxAge, path, domainName, httpOnly, false,response);}private static void setCookie(String key, String value, int maxAge,String path, String domainName, final boolean httpOnly,final boolean secure, HttpServletResponse response) {if (response != null) {Cookie cookie = new Cookie(key, value);cookie.setMaxAge(maxAge);if (StringUtils.isNotBlank(path))cookie.setPath(path);elsecookie.setPath(PATH);if (StringUtils.isNotBlank(domainName))cookie.setDomain(domainName);cookie.setVersion(0);cookie.setSecure(secure);if (httpOnly) {final StringBuffer buf = new StringBuffer();getCookieHeaderValue(cookie, buf, httpOnly);response.addHeader(getCookieHeaderName(cookie), buf.toString());} elseresponse.addCookie(cookie);}}private static String getCookieHeaderName(final Cookie cookie) {final int version = cookie.getVersion();if (version == 1) {return "Set-Cookie2";} else {return "Set-Cookie";}}private static void getCookieHeaderValue(final Cookie cookie,final StringBuffer buf, final boolean httpOnly) {final int version = cookie.getVersion();// this part is the same for all cookies
String name = cookie.getName(); // Avoid NPE on malformed cookiesif (name == null) {name = "";}String value = cookie.getValue();if (value == null) {value = "";}buf.append(name);buf.append("=");maybeQuote(version, buf, value);// add version 1 specific informationif (version == 1) {// Version=1 ... requiredbuf.append("; Version=1");// Comment=commentif (cookie.getComment() != null) {buf.append("; Comment=");maybeQuote(version, buf, cookie.getComment());}}// add domain information, if presentif (cookie.getDomain() != null) {buf.append("; Domain=");maybeQuote(version, buf, cookie.getDomain());}// Max-Age=secs/Discard ... or use old "Expires" formatif (cookie.getMaxAge() >= 0) {if (version == 0) {buf.append("; Expires=");SimpleDateFormat dateFormat = new SimpleDateFormat(OLD_COOKIE_PATTERN, LOCALE_US);dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); // 必须使用GMT模式if (cookie.getMaxAge() == 0) {dateFormat.format(new Date(10000), buf,new FieldPosition(0));} else {dateFormat.format(new Date(System.currentTimeMillis()+ cookie.getMaxAge() * 1000L), buf,new FieldPosition(0));}} else {buf.append("; Max-Age=");buf.append(cookie.getMaxAge());}} else if (version == 1) {buf.append("; Discard");}// Path=pathif (cookie.getPath() != null) {buf.append("; Path=");maybeQuote(version, buf, cookie.getPath());}// Secureif (cookie.getSecure()) {buf.append("; Secure");}// HttpOnlyif (httpOnly) {buf.append("; HttpOnly");}}private static void maybeQuote(final int version, final StringBuffer buf,final String value) {if (version == 0 || isToken(value)) {buf.append(value);} else {buf.append('"');buf.append(value);buf.append('"');}}/** Return true iff the string counts as an HTTP/1.1 "token".*/private static boolean isToken(final String value) {final int len = value.length();char c;final char[] charArray = value.toCharArray();for (int i = 0; i < len; i++) {c = charArray[i];if (c < 0x20 || c >= 0x7f) {return false;} else {if (checkFlag[c]) {return false;}}}return true;}
}

CookieUtil.java

10.表格Excel的导入导出功能实现

package com.alibaba.tboss.util;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import com.alibaba.fastjson.JSONObject;/*** @author yucai.xiayc Excel 解析工具,依赖POI Beanutils 1.8*/
public class ExcelUtils {/*** 内置类,用来配置Excel与Bean属性的映射关系*/public static class CellMapping {private String   header;private String   property;private String   type;// 熟悉下拉框数据源private String[] propertyData;public CellMapping(){}public CellMapping(String header, String property){this.header = header;this.property = property;}public CellMapping(String header, String property, String[] propertyData){this.header = header;this.property = property;this.propertyData = propertyData;}public String getHeader() {return header;}public void setHeader(String header) {this.header = header;}public String getProperty() {return property;}public void setProperty(String property) {this.property = property;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String[] getPropertyData() {return propertyData;}public void setPropertyData(String[] propertyData) {this.propertyData = propertyData;}}public static <T> List<T> excel2bean(Sheet sheet, Class<T> clazz, String config) throws Exception {return excel2bean(sheet, clazz, config, 0);}public static <T> List<T> excel2bean(Sheet sheet, Class<T> clazz, String config, int headerRowNum) throws Exception {List<CellMapping> mappingList = JSONObject.parseArray(config, CellMapping.class);return excel2bean(sheet, clazz, mappingList, headerRowNum);}public static <T> List<T> excel2bean(Sheet sheet, Class<T> clazz, List<CellMapping> mappingList) throws Exception {return excel2bean(sheet, clazz, mappingList, 0);}public static <T> List<T> importExcel2bean(Sheet sheet, Class<T> clazz, List<CellMapping> mappingList,int headerRowNum) throws Exception {Map<String, Integer> configMap = new HashMap<String, Integer>();Row row = sheet.getRow(headerRowNum);for (int c = 0; c < row.getLastCellNum(); c++) {String key = getCellString(row.getCell(c));if (!configMap.containsKey(key)) {configMap.put(key, c);} else {throw new RuntimeException("表头第" + (configMap.get(key) + 1) + "列和第" + (c + 1) + "列重复");}}List<T> resultList = new ArrayList<T>();for (int r = headerRowNum + 1; r <= sheet.getLastRowNum(); r++) {row = sheet.getRow(r);T t = clazz.newInstance();for (CellMapping cf : mappingList) {Integer index = configMap.get(cf.getHeader());if (index == null) {continue;}if ("string".equalsIgnoreCase(cf.getType())) {PropertyUtils.setSimpleProperty(t, cf.getProperty(), getCellString(row.getCell(index)));} else if ("date".equalsIgnoreCase(cf.getType())) {PropertyUtils.setSimpleProperty(t, cf.getProperty(), getCellDate(row.getCell(index)));} else if ("double".equalsIgnoreCase(cf.getType())) {PropertyUtils.setSimpleProperty(t, cf.getProperty(), getCellDouble(row.getCell(index)));} else if ("float".equalsIgnoreCase(cf.getType())) {PropertyUtils.setSimpleProperty(t, cf.getProperty(), (float) getCellDouble(row.getCell(index)));} else if ("int".equalsIgnoreCase(cf.getType()) || "integer".equalsIgnoreCase(cf.getType())) {PropertyUtils.setSimpleProperty(t, cf.getProperty(), (int) getCellDouble(row.getCell(index)));} else if ("long".equalsIgnoreCase(cf.getType())) {PropertyUtils.setSimpleProperty(t, cf.getProperty(), (long) getCellDouble(row.getCell(index)));} else {throw new Exception("Unrecognize Config Type");}}resultList.add(t);}return resultList;}public static <T> List<T> excel2bean(Sheet sheet, Class<T> clazz, List<CellMapping> mappingList, int headerRowNum)throws Exception {Map<String, Integer> configMap = new HashMap<String, Integer>();Row row = sheet.getRow(headerRowNum);for (int c = 0; c < row.getLastCellNum(); c++) {String key = getCellString(row.getCell(c));if (!configMap.containsKey(key)) {configMap.put(key, c);} else {throw new RuntimeException("表头第" + (configMap.get(key) + 1) + "列和第" + (c + 1) + "列重复");}}List<T> resultList = new ArrayList<T>();for (int r = headerRowNum + 1; r <= sheet.getLastRowNum(); r++) {row = sheet.getRow(r);if (row == null) break;// 遇空行,表示结束T t = clazz.newInstance();Map<String, Object> properties = new HashMap<String, Object>();boolean flag = true;// 判断整行属性全为空for (CellMapping cm : mappingList) {Integer index = configMap.get(cm.getHeader());if (index == null) {continue;}Object cellValue = getCellValue(row.getCell(index));if (cellValue != null) {properties.put(cm.getProperty(), cellValue);if (flag) {flag = false;// 有一列值不为空,则为false
                    }}}if (flag) break;// 遇一行中所有值都为空,结束
            BeanUtils.populate(t, properties);resultList.add(t);}return resultList;}public static List<Map<String, Object>> excel2map(Sheet sheet, List<CellMapping> mappingList) throws Exception {return excel2map(sheet, mappingList, 0);}public static List<Map<String, Object>> excel2map(Sheet sheet, List<CellMapping> mappingList, int headerRowNum)throws Exception {Map<String, Integer> configMap = new HashMap<String, Integer>();Row row = sheet.getRow(headerRowNum);for (int c = 0; c < row.getLastCellNum(); c++) {String key = getCellString(row.getCell(c));if (!configMap.containsKey(key)) {configMap.put(key, c);} else {throw new RuntimeException("表头第" + (configMap.get(key) + 1) + "列和第" + (c + 1) + "列重复");}}List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();for (int r = headerRowNum + 1; r <= sheet.getLastRowNum(); r++) {row = sheet.getRow(r);if (row == null) break;// 遇空行,表示结束Map<String, Object> properties = new HashMap<String, Object>();boolean flag = true;// 判断整行属性全为空for (CellMapping cm : mappingList) {Integer index = configMap.get(cm.getHeader());if (index == null) {continue;}Object cellValue = getCellValue(row.getCell(index));if (cellValue != null) {properties.put(cm.getProperty(), cellValue);if (flag) {flag = false;// 有一列值不为空,则为false
                    }}}if (flag) break;// 遇一行中所有值都为空,结束
            resultList.add(properties);}return resultList;}public static List<Map<String, Object>> excel2mapnohead(Sheet sheet, List<CellMapping> mappingList,HashMap<String, Integer> configMap) throws Exception {int headerRowNum = 0;List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();for (int r = headerRowNum; r <= sheet.getLastRowNum(); r++) {Row row = sheet.getRow(r);if (row == null) {continue;}Map<String, Object> properties = new HashMap<String, Object>();for (CellMapping cm : mappingList) {Integer index = configMap.get(cm.getHeader());if (index == null) {continue;}Object cellValue = getCellValue(row.getCell(index));if (cellValue != null) {properties.put(cm.getProperty(), cellValue);}}if (properties.isEmpty() == false) {resultList.add(properties);}}return resultList;}public static <T> void bean2excel(List<T> list, Sheet sheet, List<CellMapping> mappingList) throws Exception {bean2excel(list, sheet, mappingList, 0);}/*** Excel sheet 由参数传入,建议Excel样式由模板提供 程序只负责导数据,后续可以考虑增加 CellStyle 参数*/public static <T> void bean2excel(List<T> list, Sheet sheet, List<CellMapping> mappingList, int headerRowNum)throws Exception {int colPointer = 0;Row row = accessRow(sheet, headerRowNum++);CellStyle dateStyle = null;for (CellMapping cm : mappingList) {XSSFCellStyle cellStytle = (XSSFCellStyle) sheet.getWorkbook().createCellStyle();if (cm.getHeader().contains("*")) {// 红色强调cellStytle.setFillForegroundColor(new XSSFColor(new java.awt.Color(240, 180, 180)));} else {// 黄色标题cellStytle.setFillForegroundColor(new XSSFColor(new java.awt.Color(220, 220, 220)));}cellStytle.setWrapText(true);cellStytle.setFillPattern(CellStyle.SOLID_FOREGROUND);cellStytle.setBorderBottom(XSSFCellStyle.BORDER_MEDIUM);cellStytle.setAlignment(XSSFCellStyle.ALIGN_CENTER);Cell cell = accessCell(row, colPointer++);cell.setCellValue(cm.getHeader());cell.setCellStyle(cellStytle);}// for (CellMapping cm : mappingList) {// accessCell(row, colPointer++).setCellValue(cm.getHeader());// }// 为空时,只给第一行添加下拉选择器if (CollectionUtils.isEmpty(list)) {for (int i = 0; i < 1; i++) {row = accessRow(sheet, headerRowNum++);colPointer = 0;for (CellMapping cm : mappingList) {Cell cell = accessCell(row, colPointer++);// sprint8 wb-liuluokangif (null != cm.getPropertyData() && cm.getPropertyData().length > 0) {setValidation(sheet, cm.getPropertyData(), row.getRowNum(), row.getRowNum(),cell.getColumnIndex(), cell.getColumnIndex());}}}}for (T d : list) {row = accessRow(sheet, headerRowNum++);colPointer = 0;for (CellMapping cm : mappingList) {Object o = PropertyUtils.getSimpleProperty(d, cm.getProperty());Cell cell = accessCell(row, colPointer++);// sprint8 wb-liuluokangif (null != cm.getPropertyData() && cm.getPropertyData().length > 0) {setValidation(sheet, cm.getPropertyData(), row.getRowNum(), row.getRowNum(), cell.getColumnIndex(),cell.getColumnIndex());}if (o == null) {} else if (String.class.isAssignableFrom(o.getClass())) {cell.setCellValue((String) o);} else if (Date.class.isAssignableFrom(o.getClass())) {cell.setCellValue((Date) o);// 日期存储为Number,显示需求依赖CellStyleif (dateStyle == null) {dateStyle = sheet.getWorkbook().createCellStyle();dateStyle.setDataFormat(sheet.getWorkbook().getCreationHelper().createDataFormat().getFormat("yyyy/m/d"));}cell.setCellStyle(dateStyle);} else if (Number.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Number) o).doubleValue());} else if (Boolean.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Boolean) o).booleanValue());} else {cell.setCellValue(o.toString());}}}}public static <T> Workbook exportToExcel(List<T> list, List<CellMapping> mappingList) throws Exception {Workbook wb = new XSSFWorkbook();Sheet sheet = wb.createSheet("export");int colPointer = 0;int rowPointer = 0;Row row = sheet.createRow(rowPointer++);CellStyle dateStyle = null;for (CellMapping cm : mappingList) {row.createCell(colPointer++).setCellValue(cm.getHeader());}for (T d : list) {row = sheet.createRow(rowPointer++);colPointer = 0;for (CellMapping cm : mappingList) {Object o = PropertyUtils.getSimpleProperty(d, cm.getProperty());Cell cell = accessCell(row, colPointer++);if (o == null) {} else if (String.class.isAssignableFrom(o.getClass())) {cell.setCellValue((String) o);} else if (Date.class.isAssignableFrom(o.getClass())) {cell.setCellValue((Date) o);// 日期存储为Number,显示需求依赖CellStyleif (dateStyle == null) {dateStyle = wb.createCellStyle();dateStyle.setDataFormat(wb.getCreationHelper().createDataFormat().getFormat("yyyy/m/d"));}cell.setCellStyle(dateStyle);} else if (Number.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Number) o).doubleValue());} else if (Boolean.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Boolean) o).booleanValue());} else {cell.setCellValue(o.toString());}}}return wb;}public static void map2excel(List<Map<String, Object>> list, Sheet sheet, List<CellMapping> mappingList)throws Exception {int colPointer = 0;int headerRowNum = 0;Row row = accessRow(sheet, headerRowNum++);CellStyle strStyle = sheet.getWorkbook().createCellStyle();strStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("@"));CellStyle dateStyle = sheet.getWorkbook().createCellStyle();dateStyle.setDataFormat(sheet.getWorkbook().getCreationHelper().createDataFormat().getFormat("yyyy/m/d"));for (CellMapping cm : mappingList) {accessCell(row, colPointer++).setCellValue(cm.getHeader());}for (Map<String, Object> d : list) {row = accessRow(sheet, headerRowNum++);colPointer = 0;for (CellMapping cm : mappingList) {Object o = d.get(cm.getProperty());Cell cell = accessCell(row, colPointer++);if (o == null) {} else if (String.class.isAssignableFrom(o.getClass())) {cell.setCellValue((String) o);// spring 9 wb-jiangchengqiao加入 ,设置excel 下载格式为文本
                    cell.setCellStyle(strStyle);} else if (Date.class.isAssignableFrom(o.getClass())) {cell.setCellValue((Date) o);// 日期存储为Number,显示需求依赖CellStyle
                    cell.setCellStyle(dateStyle);} else if (Number.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Number) o).doubleValue());} else if (Boolean.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Boolean) o).booleanValue());cell.setCellType(Cell.CELL_TYPE_BOOLEAN);// wb-liuluokang sprint9 加入} else {cell.setCellValue(o.toString());}}}}public static void map2excelnohead(List<Map<String, Object>> list, Sheet sheet, List<CellMapping> mappingList)throws Exception {int colPointer = 0;int headerRowNum = 0;CellStyle dateStyle = sheet.getWorkbook().createCellStyle();dateStyle.setDataFormat(sheet.getWorkbook().getCreationHelper().createDataFormat().getFormat("yyyy/m/d"));/** Row row = accessRow(sheet,headerRowNum++); for(CellMapping cm:mappingList){* accessCell(row,colPointer++).setCellValue(cm.getHeader()); }*/for (Map<String, Object> d : list) {Row row = accessRow(sheet, headerRowNum++);colPointer = 0;for (CellMapping cm : mappingList) {Object o = d.get(cm.getProperty());Cell cell = accessCell(row, colPointer++);if (o == null) {} else if (String.class.isAssignableFrom(o.getClass())) {cell.setCellValue((String) o);} else if (Date.class.isAssignableFrom(o.getClass())) {cell.setCellValue((Date) o);// 日期存储为Number,显示需求依赖CellStyle
                    cell.setCellStyle(dateStyle);} else if (Number.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Number) o).doubleValue());} else if (Boolean.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Boolean) o).booleanValue());} else {cell.setCellValue(o.toString());}}}}public static void copyRow(Workbook workbook, Sheet worksheet, int sourceRowNum, int destinationRowNum) {// Get the source / new rowRow newRow = worksheet.getRow(destinationRowNum);Row sourceRow = worksheet.getRow(sourceRowNum);// If the row exist in destination, push down all rows by 1 else create a new rowif (newRow != null) {worksheet.shiftRows(destinationRowNum, worksheet.getLastRowNum(), 1);} else {newRow = worksheet.createRow(destinationRowNum);}// Loop through source columns to add to new rowfor (int i = 0; i < sourceRow.getLastCellNum(); i++) {// Grab a copy of the old/new cellCell oldCell = sourceRow.getCell(i);Cell newCell = newRow.createCell(i);// If the old cell is null jump to next cellif (oldCell == null) {newCell = null;continue;}// Copy style from old cell and apply to new cellCellStyle newCellStyle = workbook.createCellStyle();newCellStyle.cloneStyleFrom(oldCell.getCellStyle());;newCell.setCellStyle(newCellStyle);// If there is a cell comment, copyif (oldCell.getCellComment() != null) {newCell.setCellComment(oldCell.getCellComment());}// If there is a cell hyperlink, copyif (oldCell.getHyperlink() != null) {newCell.setHyperlink(oldCell.getHyperlink());}// Set the cell data type
            newCell.setCellType(oldCell.getCellType());// Set the cell data valueswitch (oldCell.getCellType()) {case Cell.CELL_TYPE_BLANK:newCell.setCellValue(oldCell.getStringCellValue());break;case Cell.CELL_TYPE_BOOLEAN:newCell.setCellValue(oldCell.getBooleanCellValue());break;case Cell.CELL_TYPE_ERROR:newCell.setCellErrorValue(oldCell.getErrorCellValue());break;case Cell.CELL_TYPE_FORMULA:newCell.setCellFormula(oldCell.getCellFormula());break;case Cell.CELL_TYPE_NUMERIC:newCell.setCellValue(oldCell.getNumericCellValue());break;case Cell.CELL_TYPE_STRING:newCell.setCellValue(oldCell.getRichStringCellValue());break;}}// If there are are any merged regions in the source row, copy to new rowfor (int i = 0; i < worksheet.getNumMergedRegions(); i++) {CellRangeAddress cellRangeAddress = worksheet.getMergedRegion(i);if (cellRangeAddress.getFirstRow() == sourceRow.getRowNum()) {CellRangeAddress newCellRangeAddress = new CellRangeAddress(newRow.getRowNum(),(newRow.getRowNum() + (cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow())),cellRangeAddress.getFirstColumn(),cellRangeAddress.getLastColumn());worksheet.addMergedRegion(newCellRangeAddress);}}}private static Row accessRow(Sheet sheet, int rownum) {Row row = sheet.getRow(rownum);if (row == null) {row = sheet.createRow(rownum);}return row;}private static Cell accessCell(Row row, int column) {Cell cell = row.getCell(column);if (cell == null) {cell = row.createCell(column);}return cell;}public static String getCellString(Cell cell) {if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) {return null;}if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC|| (cell.getCellType() == Cell.CELL_TYPE_FORMULA && cell.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC)) {if (cell.getNumericCellValue() == (long) cell.getNumericCellValue()) {return String.valueOf((long) cell.getNumericCellValue());} else {return String.valueOf(cell.getNumericCellValue());}} else {return cell.toString();}}public static Date getCellDate(Cell cell) {if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) {return null;}if (DateUtil.isCellDateFormatted(cell)) {return DateUtil.getJavaDate(cell.getNumericCellValue());} else {String result = getCellString(cell);Date resultDate = null;try {resultDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(result);} catch (ParseException e) {try {resultDate = new SimpleDateFormat("yyyy-MM-dd").parse(result);} catch (ParseException e1) {}}return resultDate;}}public static double getCellDouble(Cell cell) {if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) {return 0D;}if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {return cell.getNumericCellValue();} else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {if (cell.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC) {return cell.getNumericCellValue();}}double result = 0;try {result = Double.parseDouble(getCellString(cell));} catch (Exception e) {}return result;}public static Object getCellValue(Cell cell) {Object result = null;if (cell != null) {int cellType = cell.getCellType();if (cellType == Cell.CELL_TYPE_FORMULA) {cellType = cell.getCachedFormulaResultType();}switch (cellType) {case Cell.CELL_TYPE_STRING:result = cell.getStringCellValue();break;case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {result = cell.getDateCellValue();} else {if (cell.getNumericCellValue() == (long) cell.getNumericCellValue()) {return (long) cell.getNumericCellValue();} else {return cell.getNumericCellValue();}}break;case Cell.CELL_TYPE_BOOLEAN:result = cell.getBooleanCellValue();break;default:}}return result;}/*** 设置某些列的值只能输入预制的数据,显示下拉框.* * @param sheet 要设置的sheet.* @param textlist 下拉框显示的内容* @param firstRow 开始行* @param endRow 结束行* @param firstCol 开始列* @param endCol 结束列*/public static Sheet setValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) {// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);// 加载下拉列表内容DataValidationHelper helper = sheet.getDataValidationHelper();DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist);DataValidation dataValidation = helper.createValidation(constraint, regions);// 处理Excel兼容性问题if (dataValidation instanceof XSSFDataValidation) {dataValidation.setSuppressDropDownArrow(true);dataValidation.setShowErrorBox(true);} else {dataValidation.setSuppressDropDownArrow(false);}// 设置输入信息提示信息dataValidation.createPromptBox("下拉选择提示", "请使用下拉方式选择合适的值!");// 设置输入错误提示信息dataValidation.createErrorBox("选择错误提示", "你输入的值未在备选列表中,请下拉选择合适的值!");sheet.addValidationData(dataValidation);return sheet;}public static void excels(List<Map<String, Object>> list, Sheet sheet, List<CellMapping> mappingList)throws Exception {Sheet sheet1 = sheet;int colPointer = 0;int headerRowNum = 0;Row rows = accessRow(sheet1, headerRowNum++);CellStyle strStyles = sheet1.getWorkbook().createCellStyle();strStyles.setDataFormat(HSSFDataFormat.getBuiltinFormat("@"));CellStyle dateStyles = sheet1.getWorkbook().createCellStyle();dateStyles.setDataFormat(sheet1.getWorkbook().getCreationHelper().createDataFormat().getFormat("yyyy/m/d"));for (CellMapping cm : mappingList) {accessCell(rows, colPointer++).setCellValue(cm.getHeader());}colPointer = 0;headerRowNum = 1;Row row = accessRow(sheet, headerRowNum++);CellStyle strStyle = sheet.getWorkbook().createCellStyle();strStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("@"));CellStyle dateStyle = sheet.getWorkbook().createCellStyle();dateStyle.setDataFormat(sheet.getWorkbook().getCreationHelper().createDataFormat().getFormat("yyyy/m/d"));for (CellMapping cm : mappingList) {accessCell(row, colPointer++).setCellValue(cm.getHeader());}for (Map<String, Object> d : list) {row = accessRow(sheet, headerRowNum++);colPointer = 0;for (CellMapping cm : mappingList) {Object o = d.get(cm.getProperty());Cell cell = accessCell(row, colPointer++);if (o == null) {} else if (String.class.isAssignableFrom(o.getClass())) {cell.setCellValue((String) o);// spring 9 wb-jiangchengqiao加入 ,设置excel 下载格式为文本
                    cell.setCellStyle(strStyle);} else if (Date.class.isAssignableFrom(o.getClass())) {cell.setCellValue((Date) o);// 日期存储为Number,显示需求依赖CellStyle
                    cell.setCellStyle(dateStyle);} else if (Number.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Number) o).doubleValue());} else if (Boolean.class.isAssignableFrom(o.getClass())) {cell.setCellValue(((Boolean) o).booleanValue());cell.setCellType(Cell.CELL_TYPE_BOOLEAN);// wb-liuluokang sprint9 加入} else {cell.setCellValue(o.toString());}}}}
}

ExcelUtil.java

11.错误码枚举值,规范定义了自定义异常

/** Copyright 2014 Alibaba.com All right reserved. This software is the confidential and proprietary information of* Alibaba.com ("Confidential Information"). You shall not disclose such Confidential Information and shall use it only* in accordance with the terms of the license agreement you entered into with Alibaba.com.*/
package com.alibaba.tboss.exception;import java.text.MessageFormat;/*** 类ErrorCode.java的实现描述:TODO 类实现描述* * @author vmdata 2014年12月22日 下午4:09:48*/
public enum ErrorCode {// ----------------- 公用错误代码(1000-1099)---------------------------Success("1000", "成功"),Params_Lost("1001", "缺少必要参数[{0}]"),Params_Invalid("1002", "参数[{0}]无效"),Params_Undefine("1003", "错误的请求参数"),No_Data("1004", "数据不存在或已取消"),Opt_Expire("1006", "操作过期"),Opt_Processed("1007", "工单已被处理"),Upload_File_Error("1008", "文件上传失败[{0}]"),Undefine_Params("1005", "错误的请求参数"),Operation_expire("1006", "操作过期"),Operation_processed("1007", "工单已被处理"),Unexceptable_Params("1009", "不符合要求的参数"),No_Permission("2000", "无操作权限"),No_AssetData("2001", "缺少设备列表信息"),NO_OVERDUE("2002", "时间超过5天不能修改"),StarAgent_Error("9990", "StarAgent接口调用失败"),Armory_Rack_Error("9991", "机柜信息变更请求出错[{0}]"),Armory_Update_Error("9992", "设备信息更新到Amory出错"),Query_Failured("9993", "查询资产数据库失败,没有符合条件的数据!"),Armory_Query_Error("9994", "Armory查询失败"),Send_Email_Error("9995", "发送邮件出错"),Send_AliIM_Error("9996", "发送旺旺消息出错"),Query_Error("9997", "查询数据出错"),Sys_Error("9998", "系统错误"),DB_error("9999", "数据库操作失败"),Title_Null("8001", "标题不能为空"),Demander_Null("8002", "需求方不能为空"),Approval_Null("8003", "审批意见不能为空"),Idc_Not_Found("8004", "机房信息不存在"),Armory_UnSupport_QueryType("8005", "不支持的查询类型"),Armory_Query_Dif_Result("8006", "设备查询数{},实际有效{}"),location_error("8007", "机位占用释放错误"),UnIslocks_error("8008", "设备锁释放失败"),Api_Creator_Not_Found("2003", "创建人信息[{0}]不存在"),Api_lock_Params("2004", "SN[{0}]已锁定,请解锁后再操作,或联系PD"),Api_Unlock_Params("2004", "SN[{0}]处于已解锁状态,不可操作或联系PD"),Resource_error("2005", "操作失败"),Api_Query_Failured("2006", "查询失败SN[{0}]没有符合条件的数据!"),Api_Query_Errory("2007", "SN[{0}]是网络设备,不能提交"),Api_SN_Errory("2008", "SN有相同的数据,请检查"),up_down_errory("2009", "sn[{0}]目标机位信息格式错误(格式:XX-YY)"),Resource_Query_Error("2010", "Resource查询失败"),Resource_Update_Error("2011", "ResouceArmoryInfo更新失败"),work_order_is_null("2012", "工单不存在"),Not_Is_Logistics("2013", "搬迁单是跨机房搬迁,无法跳过物流"),Query_Rack_is_null("2014", "查询失败机柜[{0}]没有符合条件的数据!"),Rack_isNot_Wiring("2015", "机柜[{0}]已处于布线中或已完成无法发起布线申请"),Rack_Start_Wiring("2016", "机柜[{0}]生命周期处于非待验收和验收交付环节,无法发起布线申请"),Rack_isNot_endWiring("2017", "机柜[{0}]机柜未发起布线申请或布线已经完成,无法再操作"),Rack_end_Wiring("2018", "机柜[{0}]生命周期处于非验收交付环节,无法发起完成布线申请"),RACK_ISNOT_ACCEPTANCE("1303", "机柜[{0}]生命周期非待验收,无法发起验收"),ERROR_MESSAGES("1304", "风险库无法删除:\n{0}"),Armory_spareUpdate_Error("2020", "配件信息更新到Amory出错"),up_down_errorys("1305", "sn[{0}]目标机位信息格式错误(格式:XX)"),// ----------------- 物流申请工单错误代码(10000-11000)---------------------------
Differ_SourceSite("10000", "原机房信息不一致"),Differ_TagRoom("10001", "目标房间信息不一致"),// ----------------- 设备出\入工单错误代码(11001-12000)---------------------------Site_Null("11001", "IDC机房不能为空"),Contactor_Null("11002", "联系人不能为空"),InOut_Null("11003", "出/入类型不能为空"),signDate_Null("11004", "签字日期不能为空"),InoutDate_Null("11005", "出/入日期不能为空"),InoutReason_Null("11006", "出/入原因不能为空"),Differ_Site("11007", "IDC机房信息不一致"),Reminder_Error("11008", "催单失败,未配置运营商邮箱"),Reminder_Success("11009", "催单成功"),Approval_Achieved("11010", "工单已审批,已结单"),Leng_limted("11011", "输入内容超过最大长度[{0}]限制"),Email_Null("11012", "机房[{0}]运营商邮箱地址不能为空"),No_Email("11013", "审批通过,运营商邮箱地址为空,邮件发送失败"),Submit_Success("11014", "提交成功"),Finish_Success("11015", "操作成功"),// ----------------- 网络布/撤线工单错误代码(12001-13000)---------------------------Asset_SN_Lost("12001", "设备名称不能为空"),Fiber_Model_Lost("12002", "单双模不能为空"),Interface_Type_Lost("12003", "接口类型不能为空"),Line_Lable_Lost("12004", "线缆标签不能为空"),Port_Id_Lost("12005", "端口号不能为空"),Wiring_Id_Is_Null("12006", "网络设备布/撤线工单ID不能为空!"),Wiring_Is_Not_Exists("12007", "网络设备布/撤线工单不存在!"),Wiring_Detail_List_Is_Empty("12008", "网络设备布/撤线工单明细列表不能为空!"),NOT_PORT("12009", "暂无可用端口"),NOT_ORDERID("12010", "工单编号不能为空"),NOT_SATISFIEDRESON("12011", "满意原因不能为空"),NOT_DISSATISFIEDREASON("12012", "不满意原因不能为空"),Wiring_IDC_Is_Null("12013", "IDC不能为空!"),Wiring_Priority_Is_Null("12014", "优先级不能为空!"),Wiring_OperationTime_Is_Null("12015", "操作时间不能为空!"),Wiring_Type_Is_Null("12016", "工单类型不能为空!"),Wiring_Status_Is_Null("12017", "工单状态或子状态不能为空!"),Wiring_Detail_Is_Null("12018", "{0}网络设备布/撤线工单明细不能为空!"),Wiring_Detail_SiteA_Is_Null("12019", "{0}A端机房为空或不存在!"),Wiring_Detail_RoomA_Is_Null("12020", "{0}A端房间为空或不存在!"),Wiring_Detail_RackA_Is_Null("12021", "{0}A端机柜为空或不存在!"),Wiring_Detail_Line_Mode_A_Is_Null("12040", "{0}A端线缆类型为空或不存在!"),Wiring_Detail_Interface_Type_A_Is_Null("12041", "{0}A端接口类型为空或不存在!"),Wiring_Detail_Not_ODF_Port("12022", "{0}找不到空闲的ODF端口!"),Wiring_Detail_SiteB_Is_Null("12023", "{0}B端机房为空或不存在!"),Wiring_Detail_RoomB_Is_Null("12024", "{0}B端房间为空或不存在!"),Wiring_Detail_RackB_Is_Null("12025", "{0}B端机柜为空或不存在!"),Wiring_Detail_Line_Mode_B_Is_Null("12042", "{0}B端线缆类型为空或不存在!"),Wiring_Detail_Interface_Type_B_Is_Null("12043", "{0}B端接口类型为空或不存在!"),Wiring_Detail_PortAB_Is_Same("12027", "{0}A端和B端的端口不能相同!"),NOT_NULL("12028", "该SN下无端口信息"),NOT_SUPPLYED_BEFORE_ACHIEVE("12029", "工单不能结单,请补充设备信息后再结单"),NOT_SAVED_BEFORE_POST("12030", "提交前请先保存!"),Wiring_Title_Is_Null("12031", "工单标题不能为空!"),Wiring_OperationTime_Is_Old("12032", "操作时间不能小于当前日期!"),Wiring_Asset_A_Or_B_Is_Null("12033", "{0}A端和B端的设备名称必须同时为空或同时不为空!"),Wiring_SiteA_Is_Not_IDC("12034", "{0}A端的机房必须和IDC机房相同!"),Wiring_Same_Order_Null_Or_NotNull("12035", "同一个工单中的设备名称必须全部为空或全部不为空!"),Wiring_Supply_All_Asset_NotNull("12036", "补充信息时所有的设备名称和端口都不能为空!"),Batch_Import_AB_Length_Not_Same("12037", "A端文本的行数和B端文本的行数必须相同!"),Batch_Import_Field_Length_Not_Six("12038", "{0}的数据不符合规范!"),Asset_Port_Info_Is_Exists("12039", "设备端口已存在!"),Asset_not_null("12040", "设备名不能为空"),// 设备上下架工单错误代码(13001-14000)UpDown_Lost_OptType("13001", "操作类型不能为空"),UpDown_Lost_AssetType("13002", "设备类型不能为空"),UpDown_Empty_Asset("13003", "缺少设备信息"),DeviceReplace_Empty_Asset("13003", "缺少设备信息"),Is_Not_ConforMity_with_Sn_A("13004", "A端设备信息与所填机房信息不符合"),Is_Not_ConforMity_with_Sn_B("13005", "B端设备信息与所填机房信息不符合"),Is_Not_ConforMity_with_Sn("13006", "SN在Armory无信息"),NOT_FOUND_ROOM("13007", "房间不能为空"),NOT_FOUND_RACK("13007", "机柜不能为空"),NOT_PORT_ID("13008", "没有可用的ODF资源"),Down_Site_NotFound("13009", "下架机房数据为空,请联系产品负责人/开发处理。"),Updown_Notsame_Site("13010", "{0}原机房信息不一致"),Updown_Notsame_Room("13011", "{0}原房间信息不一致"),Updown_Notsame_Rack("13012", "{0}原机柜信息不一致"),Updown_Notsame_Pos("13013", "{0}原机位信息不一致"),Updown_Notsame_TargetSite("13014", "{0}目标机房信息不一致"),Updown_Notsame_TargetRoom("13015", "{0}目标房间信息不一致"),Updown_Notsame_TargetRack("13016", "{0}目标机柜信息不一致"),updown_Notsame_Model("13017", "{0}设备型号不一致"),updown_Not_sn("13018", "SN不一致"),Updown_Exl_Errory("13019", "解析exl数据出错"),Updown_Exl_Size("13020", "导入数据与原数据大小不一样"),Up_Down_error("13021", "设备列表下载失败"),updown_targetpos_error("13022", "{0}目标机位不能小于0"),Import_Exl_Error("13023", "{0}"),NOT_FOUND_TargetRoom("130224", "目标房间不能为空"),TargetRoom_Is_Not_Null("130225", "sn{0}目标房间不能为空"),UpDown_Room_IsNot_CK("130226", "sn[{0}]上架单原房间必须为仓库"),TargetRack_Is_Not_Null("130227", "sn[{0}] 上架机柜不能为空"),localtionId_is_not_null("130228", "sn[{0}] 上架localtionId不能为空"),room_in_ck("130229", "sn[{0}] 已在仓库,无法创建下架单"),UpDown_targetRoom_IsNot_CK("130230", "sn[{0}]上架单目标房间不能为为仓库"),UP_DOWN_NOT_FOUND_ROOM("130231", "SN[{0}]房间不能为空"),TargetRack_IS_NOTNULL("13024", "SN[{0}]目标房间为仓库,目标机柜,机位,LocationId必须为空"),Updown_Notsame_TargetPos("13025", "[{0}]目标机位信息不一致"),Is_Null_TargetPos("13026", "[{0}]服务器设备目标机位不能为空"),EXL_VERSION_MISMATCH("13027", "EXL版本不匹配,仅支持2013"),Is_Null_OptResult("13028", "sn[{0}]未检测,或检测结果为失败无法结单"),Asset_Updown_NotFound("13029", "上下架工单编号[{0}]未查询到信息"),// ---------------------服务器重启工单错误代码(14001-15000)---------------------Server_Reboot_Is_Not_Exists("14001", "服务器重启工单不存在!"),Server_Reboot_Type_Is_Null("14002", "重启类型不能为空!"),Server_Reboot_Emergency_Level_Is_Null("14003", "紧急程度不能为空!"),Server_Reboot_Detail_List_Is_Empty("14004", "服务器重启工单明细列表不能为空!"),Server_Is_Not_Achieve("14005", "sn[{0}]未检测,无法结单"),Server_Is_Not_Type("14006", "sn[{0}]未检测,无法设置失败类型"),// ---------------------复合工单从20001-30000----------------------------PARANT_ID_NULL("20001", "复合工单Id为空"),Srmp_Interface_Request_Fail("20002", "向SRMP发送请求失败!"),Srmp_SN_NULL("20003", "设备号不能为空!"),Asset_Move_Order_CallBack_Error("20004", "搬迁工单回调失败"),Asset_Move_Order_NotFound("20005", "搬迁工单[orderId={0}]信息不存在"),Asset_Move_Order_NoPermission("20006", "无此工单查询权限"),Asset_Move_Order_Asset_NotFound("20007", "设备信息sn=[{0}]未找到"),Asset_Order_NotFound("20008", "原子工单信息不存在"),Asset_order_islock("20009", "sn[{0}]处于已锁定状态不可操作"),Asset_Move_Order_Achieve_Error("20010", "搬迁工单无法结单,{0}"),Asset_Move_NotSameDeviceType("20012", "sn[{0}]设备类型不唯一,请检查"),up_down_NotSamesite("20013", "原机房不一致,请检查"),device_replace_NotSamesite("20014", "设备替换机房不一致,请检查"),RACK_NOTIS_STORAGE("20014", "SN[{0}]是存储设备,目标机柜必须是存储机柜"),ASSETMOVE_ISNOT_ACHIEVE("20015", "搬迁单[{0}]上下架单处理中,无法取消"),Updown_Operation_processed("20016", "搬迁单[{0}]在下架环节已被处理,无法取消搬迁单"),AssetMove_Isprocessed("20017", "搬迁单[{0}]已结单或已取消,无法继续取消"),NOT_ALLOW_MODIFIER("20017", "buc无该操作人信息,不允许操作"),ASSETMOVE_ASSET_ISNULL("20018", "SN{0}信息不存在,无法取消"),ASSETMOVE_ISNOT_LOGIS("20019", "搬迁单[{0}]物流单处于待签收或已签收环节,无法取消"),ASSETMOVE_ISNOT_ACHIEVES("20015", "搬迁单[{0}]上下架单处理中或物流单处于待签收或已签收环节,无法取消"),RMA_Error("20016", "{0}"),// ---------------------网络设备重启工单从30001-40000----------------------------
board_errory("30001", "SN[{0}]板卡系信息错误(符合数据为0——1000)"),modular_errory("30001", "SN[{0}]模块系信息错误(符合数据为0——1000)"),// ----------------- 机房相关错误信息(1100-1099)------------------------// ----------------- 房间相关错误信息(1200-1299)------------------------
ROOM_IS_NULL("1201", "[{0}]房间不存在"),// ----------------- 机柜相关错误信息(1300-1399)------------------------param_number("1300", "单号请输入数字"),NOT_FOUND_IDCRACK("1301", "[{0}]机柜数据为空或没找到该机柜"),RACK_IN_ASW("1302", "[{0}]机柜已在网络分组中"),RACK_AND_ROOM_IS_NOTNULL("1302", "[{0}]房间机柜只能同时为空,或则同时不为空"),RACK_AND_ROOM_ISERROR("1303", "[{0}]机柜编号或房间不能为空"),RACK_ACCEEPTANCE_INFO_LOCK("1304", "[{0}] 机柜验收属性已锁住,不可以修改"),RACK_NETWORK_INFO_LOCK("1305", "[{0}] 机柜网络属性已锁住,不可以修改"),RACK_PHYSICS_INFO_LOCK("1036", "[{0}]物理属性已锁住,不可以修改"),RACK_IS_NOT_MODIFIER("1037", "机柜[{0}]生命周期非待验收或验收交付,机柜属性不可以修改"),RACK_IsNot_CK("1038", "机柜[{0}]房间为仓库不能新建机柜"), RACK_IsLogicPod("1039", "机柜[{0}]网络集群,逻辑POD,POD 要一起修改"),// ----------------- 机位相关错误信息(1400-1499)------------------------
Process_Failed("9997", "创建流程失败"),DB_Failed("9998", "数据库操作失败"),System_Error("9999", "系统错误"),// --------------------设备替换错误信息(50001-60000)-----------------
Site_Is_Not_SAME("50001", "sn[{0}]新旧设备不在同一机房"),Device_Replace_NOT_FOUND_ROOM("50002", "SN[{0}]房间不能为空"),Device_Replace_Room_IsNot_CK("50003", "SN[{0}]新设备房间不为仓库,请检查"),Device_Replace_NoPermission("50004", "无此工单查询权限"),Device_Replace_NotFound("50005", "设备替换工单[orderId={0}]信息不存在"),Device_Replace_Asset_NotFound("50006", "Sn[{0}]信息未找到"),Device_Replace_Room_Is_Null("50007", "sn[{0}]新设备房间为空"),Device_Replace_room_in_ck("50008", "sn[{0}]旧设备不在架上,请检查"),Device_Replace_Operation_processed("50009", "工单已被处理,不能取消"),Device_Replace_Model_Is_Null("50010", "SN[{0}]厂商型号为空"),Device_Replace_Model_Is_Not_Same("50011", "SN[{0}]厂商型号不一致,无法创建设备替换工单"),Device_Replace_Params_Invalid("50012", "参数[{0}]无效,必须为20150819202020格式"),Device_Replace_Differ_SourceSite("50013", "机房信息不一致"),Device_Replace_No_Data("50014", "设备替换工单信息不存在"),Device_Replace_No_location_Data("50015", "SN[{0}]旧设备缺少机位信息"),Device_Replace_No_rack_Data("50015", "SN[{0}]旧设备缺少机柜信息"),device_replace_NotSamesites("50016", "SN[{0}]设备所在机房不一致,请检查"),Device_Replace_canOptTimeStart_isLargerThan_canOptTimeEnd("50017", "参数允许操作时间段-开始时间不能晚于结束时间,请检查"),device_replace_Date_error("50018", "日期格式错误,请检查"),Device_Replace_canOptTimeEnd("50019", "参数操作时间段-结束时间不能早于当前时间,请检查"),ALLOWS_ENDTIME_NOTEARLIER_CURRENTTIME("50020", "允许操作结束时间不能早于当前时间"),ALLOW_STARTTIME_NOTLATER_OPERATIONTIME("50021", "允许操作开始时间不能晚于允许操作结束时间"),NOT_ALLOW_CREATE("50022", "buc无该操作人信息,不允许建单"),Device_Replace_Asset_Data_NotFound("50023", "设备替换工单信息不存在"),NOT_ALLOW_CANCLE("50024", "buc无该操作人信息,不允许取消"),// -------------------------设备安全,质量安全(60001-70000)-------------------------------RISKPOINT_LENGTH_ERROR("60001", "风险点长度小于200个字"),VERIFYMODE_LENGTH_ERROR("60002", "验证方式长度小于200个中文字符"),COMPONENT_ID_LENGTH_ERROR("60003", "一级组件长度小于10个中文字符"),TAG_ID_LENGTH_ERROR("60004", "标签长度小于20个中文字符"),PARAMS_IS_NULL("60003", "参数[{0}]为空"),DATA_IS_ON_PROCESS("60004", "数据已在流程中,不能重新操作"),DATA_IS_OPRATORED("60005", "该数据已被操作,请检查"),All_SITE_ON_RANGE("60006", "影响范围格式错误(整体机房与其他房间不能同时选择)"),FINISH_SITUATION("60007", "[{0}]完成情况为未完成,不能结单"),FINISH_SITUATIONS("60008", "该数据已经发起结单,不能再操作"),RISKSTATUS_IS_ERROR("60009", "风险登记册未关闭无法开启:\n{0}"),RISKREGISTRA_IS_NOTNULL("60010", "风险登记册{0}无法重新开启,该机房下已存在新的风险登记册"),RISKPOOL_IS_NULL("60011", "风险登记册[{0}]的风险库条目已删除,无法重新开启"),RiskEntriesNumber_Data_Is_Not_exit("60012", "风险库编号所对应的数据不存在"),RISKSTATUS_IS_SAME("60013", "风险登记册编号[{0}]的机房和风险库编号相同,无法同时开启"),// ---------------------------通用原子工单(70001-80000)---------------------------------Common_Atomic_No_Data("70001", "工单信息不存在"), Common_Atomic_Operation_processed("70002", "工单已被处理,不能取消"),Common_Atomic_Asset_NotFound("70002", "Sn[{0}]信息未找到"),Common_Atomic_NoPermission("70003", "无此工单查询权限"),Common_Atomic_No_AssetData("70004", "缺少SN信息"),Common_Atomic_Differ_SourceSite("70005", "sn[{0}]机房信息不一致"),// ------------------------------基础设施信息(80001-9000)--------------------------------------------Infrastr_No_Is_Same("80001", "设备编号[{0}]已存在,请检查"),SITENAME_IS_NULL("80002", "机房为空,请先选择机房"),Profession_IS_NULL("80003", "所属专业为空,请先选择所属专业"),BuildPeriod_IS_NULL("80004", "建设期为空,请先选择建设期"),DeviceType_Is_Column_Header("80005", "设备类型为列头柜,不能导入"),Approve_Informati_Is_Null("80006", "审批信息不存在"),// ------------------------------流程引擎(90001-10000)--------------------------------------------FLOW_CANT_START("90001", "无法启动流程实例"), FLOW_NOT_FOUND_ACTION("90002", "提交动作[{0}]未定义"),FLOW_NONE_START_ACTION("90003", "未指定开始动作"), FLOW_NONE_TASK("90004", "未指定动作的执行任务"),// ----------------- 人员入室相关错误信息(40000-50000)------------------------selectMyStaffERApproval_Error("40001", "一级审批查询错误"), selectMyStaffERApprovalSecond_Error("40002", "二级审批查询错误"),selectMyApprovalStaf("40003", "我的人员入档审批查询错误"),// -------------------rma工单 下架结单生成硬盘拔出-----------------createHardDiskPullOutOrder("40004", "生成硬盘拔除工单失败");String code; // 代码String msg; // 消息public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}private ErrorCode(String code, String msg){this.code = code;this.msg = msg;}public String getFullMsg(String... arg) {if (null == arg || arg.length == 0) return this.msg;else return MessageFormat.format(this.msg, arg);}public static String getMsgName(String code) {for (ErrorCode c : ErrorCode.values()) {if (c.getCode().equals(code)) {return c.msg;}}return null;}public static String getTypeName(String msg) {for (ErrorCode c : ErrorCode.values()) {if (c.getMsg().equals(msg)) {return c.code;}}return null;}}

ErrorCode.java

12.业务逻辑描述:在工单系统的详情页中,需要展示对工单的操作记录,所以做了通用的模块设计,这样当要对工单详情中的日志部分作出修改的时候,能在最短的时间,最小的改动的情况下,完美的解决问题。日志表中新增附件字段,关联app_attachment表中的主键,当操作人与登录人相一致时,可以通过附件上传文件。

  解决方案:抽象出了详情页面中的orderOptList.vm模块,在工单详情页中通过$control.setTemplate("web:orderOptList.vm")引入到工单详情页中,同时在后端需要提供公共的context.put("operations", operations)和context.put("appUserInfo", pvgInfo)来配合前端数据的展现。

2.业务逻辑描述:需要在工单的详情页中添加是否超时字段,用于在结单时判断工单是否超时,如果逐个在工单中添加,侵入式太重,不利于后期维护,因此利用了java的反射机制,动态的更新是否超时字段。

  解决方案:方法中的参数设置为超级父类Object,传入的类,通过.getClass().getDeclaredMethod("方法名",方法入参逗号分隔)获取到Method类,然后再满足业务逻辑的情况下,通过method.invoke(Object obj, Object.. args)方法,调用方法刷新数据。

反射代码

对类的方法实现动态赋值,使用方法method.invoke(obj,args...)方法,方法中的obj就是一个实例化对象,args是方法的参数。

public Object invoke(Object obj, Object... args)obj:从中调用底层方法的对象,必须是实例化对象args:用于方法调用,是一个object的数组,因为参数有可能有多个

3.业务逻辑描述:在内网系统中需要提供外网访问的API接口的时候,需要

  解决方案:

4.业务逻辑描述:对部门敏感数据采用md5进行加密。

附:

1.解决SVN冲突心得:Eclipse分支调整顺序提交一次,复制到冲突分之中,复制提交一次,然后合并代码发布就可以了。

转载于:https://www.cnblogs.com/RunForLove/p/5630795.html

J2EE项目开发中常用到的公共方法相关推荐

  1. 项目开发中常用JS表单取值方法

    项目开发中常用JS表单取值方法 一.常用表单基本取值方法(form1为表单名称,TextBox1为控件ID,以文本框为例,html控件与web服务器控件是一样的)         1.form1.Te ...

  2. Git码云项目开发中常用分支

    Git码云项目开发中常用分支 master分支,即主分支.任何项目都必须有个这个分支.对项目进行tag或发布版本等操作,都必须在该分支上进行. develop分支,即开发分支,从master分支上检出 ...

  3. 项目开发中常用的git套路

    在项目开发中常用的git套路: 1.在本地文件夹中,(在库名文件夹下)打开git bash 2.如果想在github上新建一个仓库,则 git init  否则略过这一步 3.建立关联  git re ...

  4. php项目开发中常用的助手函数

    在日常开发中有很多小功能或者函数方法都是复用率极高的,整理成一个助手函数类. <?php /** *助手函数类 */ class Helper {/***密码加密*/public static ...

  5. JS项目开发中常用的一些小功能

    目录 字符串技巧 1.比较时间 2.格式化money 3.生成随机ID 4.生成随机 HEX 颜色值 5.Generate star ratings​​​​​​​ 6.网址查询参数​​​​​​​ 7. ...

  6. 开发项目时mysql常用语句_项目开发中常用到的SQL语句

    1.循环示例 循环示例代码: DECLARE @i intDECLARE 10 ) 10 ) 10001200 BEGINSet 110 )), 4 ) @name select @name Loco ...

  7. 嵌入式项目开发中的问题及解决方法

    High-precisionmeasurement 司南板卡串口阻塞读(select)超时(timeout)原因: 1.波特率设置不正确,出厂时为115200.因为BSP设计时加入的uartlite模 ...

  8. 【开发规范】go项目开发中的[流程,git,代码,目录,微服务仓库管理,静态检查]

    文章目录 前言 一.有哪些规范我们应该遵循 二.项目开发流程 三.git的代码分支管理 1. 分支管理 2. commit规范 三.go的代码规范 四.go项目目录规范 五.微服务该采用multi-r ...

  9. python web开发第三方库_Python Web开发中常用的第三方库

    Python Web开发中常用的第三方库 TL;DR 经常有朋友问,如果用Python来做Web开发,该选用什么框架?用 Pyramid 开发Web该选用怎样的组合等问题?在这里我将介绍一些Pytho ...

最新文章

  1. java监听mysql_java实时监控mysql数据库变化
  2. Activity返回数据给上一个活动
  3. 安卓java修改按钮大小_android弹出activity设置大小的方法
  4. 零基础Java学习之初始化块
  5. python 画三维函数图-如何用Matplotlib 画三维图的示例代码
  6. Mathematica基础——Part——[[]]
  7. Fiddler抓包工具详解(三)(fiddler监控面板+辅助工具)
  8. 启明云端分享| 乐鑫刚发布的 ESP32-C2与今年五月份量产的ESP32-C3有哪些不同呢?作为两颗升级替代ESP8286的芯片,我们在应用时怎么去选择呢
  9. leetcode 402. Remove K Digits | 402. 移掉 K 位数字(单调栈)
  10. while和for循环
  11. JVM思维导图、正则表达式符号图、企业内部开发流程图
  12. docker tomcat启动无法进入欢迎页面
  13. 【DP + 卖股票】LeetCode 123. Best Time to Buy and Sell Stock III
  14. deepin安装mysql记录
  15. atitit 商业项目常用模块技术知识点 v3 qc29
  16. 对261个国家地区快速查找选择
  17. This is a CONNECT tunnel, through which encrypted HTTPS traffic flows.
  18. C语言 memcpy和memcpy_s
  19. win10 聚焦每日壁纸 Bing每日壁纸 下载
  20. 深入理解计算机系统(CSAPP) 实验详解:DataLab

热门文章

  1. 三星回击苹果:将推指纹识别智能手机
  2. 智能车浅谈——控制规律篇
  3. unity 高德地图 Android
  4. 牛腩之CSS核心内容
  5. 2022四川最新建筑施工架子工(建筑特种作业)模拟考试试题及答案
  6. MySql中用sql语句实现按汉字首字母排序
  7. 对接百度api之银行卡识别
  8. Prometheus:Java调用PromQL工具类(瞬时数据查询)
  9. 累加器使用的注意点及自定义累加器
  10. Cesium实现卫星在轨绕行