theme: java后端 highlight: 后台接收json数据(Hibernate)
1、后台数据接收
接收json类型的数据
public void doGet(HttpServletRequest request, HttpServletResponse response) {
String returnMsg="";
String provinceCode="";
String oaDataSyncRequest = "";
InputStreamReader in = null;
BufferedReader bufferedReader = null;
try {
provinceCode = request.getHeader("provinceCode");
request.setCharacterEncoding("UTF-8");
in = new InputStreamReader((ServletInputStream) request.getInputStream(),"UTF-8");
bufferedReader = new BufferedReader(in);
StringBuffer stringBuffer = new StringBuffer("");
String temp;
while ((temp=bufferedReader.readLine())!=null) {
stringBuffer.append(temp);
}
oaDataSyncRequest = stringBuffer.toString();
try {
OASyncResultData returnOASyncResultData =this.returnOASyncResultData(oaDataSyncRequest);
returnMsg = JsonUtil.bean2json(returnOASyncResultData);
} catch (Exception e) {
returnMsg+=e.toString();
}
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.getWriter().write(returnMsg);
response.getWriter().flush();
response.getWriter().close();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 记录接口调用日志
LogUtil.doAsynRecordLog("OADataSyncServlet", "oa_data_sync_data", oaDataSyncRequest, returnMsg, ConfigUtil.SERVER_ADDRESS, null, provinceCode);
try {
if(bufferedReader!=null) {
bufferedReader.close();
}
if(in!=null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
/**
* 多线程处理记录日志任务
*
*/
public class AsynRecordLogThreadTask implements Runnable {
private String className;
private String functionName;
private Object inputParameter;
private Object outputParameter;
private String level;
private String account;
private String provinceCode;
public AsynRecordLogThreadTask(){
}
public AsynRecordLogThreadTask(String className, String functionName, Object inputParameter, Object outputParameter, String level, String account, String provinceCode) {
this.className=className;
this.inputParameter = inputParameter;
this.outputParameter=outputParameter;
this.functionName=functionName;
this.level=level;
this.account=account;
this.provinceCode=provinceCode;
}
public void run() {
try {
String inputDataXml=null;
if(inputParameter instanceof String){//如果是报文字符串,直接保存
inputDataXml=inputParameter.toString();
}else {
inputDataXml = BeanToXmlParser.parseBeanToDataIsland(
inputParameter, "UTF-8");
}
String outDataXml =null;
if(outputParameter instanceof String){//如果是报文字符串,直接保存
outDataXml=outputParameter.toString();
}else {
outDataXml = BeanToXmlParser.parseBeanToDataIsland(
outputParameter, "UTF-8");
}
LogUtil.doLog(className, functionName,inputDataXml, outDataXml, level, account);
} catch (Exception e) {
e.printStackTrace();
}
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getFunctionName() {
return functionName;
}
public void setFunctionName(String functionName) {
this.functionName = functionName;
}
public Object getInputParameter() {
return inputParameter;
}
public void setInputParameter(Object inputParameter) {
this.inputParameter = inputParameter;
}
public Object getOutputParameter() {
return outputParameter;
}
public void setOutputParameter(Object outputParameter) {
this.outputParameter = outputParameter;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
}
/**
*日志
**/
@Component("logUtil")
@SuppressWarnings("unchecked")
public class LogUtil {
//保存日志
public static void addLog(Log log) {
if (log != null) {
log.setDateAdded(new Date());
LogUtil.saveLog(log);
}
}
/**
* 日志处理
*
* @param className
* 类名称
* @param function
* 方法
* @param inputParameter
* 输入参数
* @param outputParameter
* 输出参数
*/
public static void doLog(String className, String function, Object inputParameter,
Object outputParameter,String level,String account) {
try {
String inputData = convertParamterToString(inputParameter).toString();
String outputData = convertParamterToString(outputParameter).toString();
Log log = new Log();
log.setClassName(className);
log.setFunction(function);
log.setInputData( inputData);
log.setLevel(level);
log.setAccount(account);
log.setOutputData( outputData);
addLog(log);
} catch (Exception e) {
// System.out.println(e.getMessage());
}
}
/**
* 具体审批人列表日志
* @param queryByExpressionLog
*/
public static void doQueryByExpressLog(QueryByExpressionLog queryByExpressionLog){
Connection connection = LogUtil.getConnection();
try {
connection.setAutoCommit(false);
} catch (SQLException e1) {
e1.printStackTrace();
}
PreparedStatement ps = null;
String sql = "insert into QUERY_BY_EXPRESSION_LOG(id,user_,pwd,expr,piid,params ,output ,error_MSG,create_date ,update_time) "
+ " values(replace(cast(uuid_generate_v1() as text),'-',''),?,?,?,?,?,?,?,now(),now()) ";
try {
ps = connection.prepareStatement(sql);
ps.setString(1, queryByExpressionLog.getUser());
ps.setString(2, queryByExpressionLog.getPwd());
ps.setString(3, queryByExpressionLog.getExpr());
ps.setString(4, queryByExpressionLog.getPiid());
ps.setString(5, queryByExpressionLog.getParams());
ps.setString(6, queryByExpressionLog.getOutput());
ps.setString(7, queryByExpressionLog.getErrorMsg());
ps.executeUpdate();
connection.commit();
} catch (SQLException e1) {
e1.printStackTrace();
}finally{
LogUtil.close(connection, ps);
}
}
/**
* 转换参数为字符串
*
* @param obj
* @return
* @throws CertificateSysException
*/
private static StringBuffer convertParamterToString(Object parameterObject) {
StringBuffer paramterToString = new StringBuffer("");
if (parameterObject == null)
return paramterToString;
if (parameterObject instanceof String || parameterObject instanceof Integer
|| parameterObject instanceof BigDecimal || parameterObject instanceof Double
|| parameterObject instanceof Float) {
paramterToString.append(parameterObject).append(" ; ");
}
else if (parameterObject instanceof Object[]) {
for (int i = 0; i < ((Object[]) parameterObject).length; i++) {
paramterToString.append(convertParamterToString(((Object[]) parameterObject)[i]));
}
}
else if (parameterObject instanceof Collection) {
for (Object o : (Collection<?>) parameterObject) {
paramterToString.append("Set Oject:" + convertParamterToString(o));
}
}
else {
Method[] declaredMethods = parameterObject.getClass().getDeclaredMethods();
for (int j = 0; j < declaredMethods.length; j++) {
Method method = declaredMethods[j];
if (method.getName().indexOf("set") != 0
&& method.getName().indexOf("getDeserializer") == -1
&& method.getName().indexOf("equals") == -1
&& method.getName().indexOf("getSerializer") == -1) {
try {
Object[] args = null;
Object value = method.invoke(parameterObject, args);
String fieldName = "";
if (method.getName().indexOf("get") == 0) {
fieldName = method.getName().substring(3);
}
else {
fieldName = method.getName().substring(2);
}
paramterToString.append(fieldName).append(" : ").append(
value == null ? "" : value).append(" ; ");
} catch (Exception e) {
// System.out.println(e.getMessage());
}
}
}
}
return paramterToString;
}
private static Connection getConnection() {
Connection conn = null;
try {
DataSource dataSource = (DataSource) BeansUtil.getBean("dataSource");
conn = dataSource.getConnection();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return conn;
}
private static void close(Connection conn, Statement stmt) {
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
}
/**
* 保存日志
* @param Log
*/
private static void saveLog(Log log) {
CommonDao commonDao = (CommonDao) BeansUtil.getBean("commonDao");
String sql = "insert into log(ID,CLASS_NAME,FUNCTION,INPUT_DATA,OUTPUT_DATA,LEVELS,ACCOUNT,DATE_ADDED) "
+ " values(replace(cast(uuid_generate_v1() as text),'-',''),:className,:function,:inputData,:outputData,:level,:account,now()) ";
try {
commonDao.createSQLQuery(sql)
.setParameter("className", log.getClassName())
.setParameter("function", log.getFunction())
.setParameter("inputData", log.getInputData())
.setParameter("outputData", log.getOutputData())
.setParameter("level", log.getLevel())
.setParameter("account", log.getAccount())
.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
/**
* 异步记录日志
*
* @param className
* @param functionName
* @param inputParameter
* @param outputParameter
* @param level
* @param account
*/
public static void doAsynRecordLog(String className, String functionName, Object inputParameter, Object outputParameter, String level, String account, String provinceCode){
// 另起一个线程记日志
AsynRecordLogThreadTask asynRecordLogThreadTask = new AsynRecordLogThreadTask(className, functionName, inputParameter, outputParameter, level, account, provinceCode);
ThreadPoolExecutorUtil.cachedThreadPool.submit(asynRecordLogThreadTask);
}
private String toXML(Object inputParameter) {
String inputData = "";
XStream xstream = new XStream();
if (inputParameter instanceof String) {
inputData = (String) inputParameter;
}
else {
if (inputParameter instanceof Object[]) {
Object[] objects = (Object[]) inputParameter;
for (Object obj : objects) {
if (obj instanceof String) {
inputData = inputData + obj.toString();
}
else {
inputData = inputData + xstream.toXML(obj);
}
}
}
else if (inputParameter instanceof Collection) {
Collection objects = (Collection) inputParameter;
for (Object obj : objects) {
if (obj instanceof String) {
inputData = inputData + obj.toString();
}
else {
inputData = inputData + xstream.toXML(obj);
}
}
}
else {
inputData = xstream.toXML(inputParameter);
}
}
return inputData;
}
private String toJSONObjectString(Object inputParameter) {
String inputData = "";
try {
if (inputParameter instanceof Object[]) {
inputData = JSONArray.fromObject(inputParameter).toString();
}
else if (inputParameter instanceof Collection) {
Collection c = (Collection) inputParameter;
if (c.size() > 0) {
Object[] a = new Object[c.size()];
c.toArray(a);
inputData = toJSONObjectString(a);
}
}
else {
inputData = JSONObject.fromObject(inputParameter).toString();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return inputData;
}
/**
* 保存日誌
*
*/
private void saveLogItsm(LogItsm log) {
Connection connection = this.getConnection();
try {
connection.setAutoCommit(false);
} catch (SQLException e1) {
e1.printStackTrace();
}
PreparedStatement ps = null;
String sql = "insert into LOG_ITSM(ID,SYS_ID,INTERFACE_NAME,INTERFACE_REMARK,MESSAGE,INPUT_DATA,TYPE,PROVINCE_CODE,SEND,CREATE_DATE) " + " values(replace(cast(uuid_generate_v1() as text),'-',''),?,?,?,?,?,?,?,'0',now()) ";
try {
ps = connection.prepareStatement(sql);
ps.setString(1, log.getSysId());
ps.setString(2, log.getInterfaceName());
ps.setString(3, log.getInterfaceRemark());
ps.setString(4, log.getMessage());
ps.setString(5, log.getInputData());
ps.setString(6, log.getType());
ps.setString(7, log.getProvinceCode());
ps.executeUpdate();
connection.commit();
} catch (SQLException e1) {
e1.printStackTrace();
} finally {
this.close(connection, ps);
}
}
}
2、json数据转成实体
public class JsonUtil {
public static final String FORMAT_1 = "yyyy-MM-dd";
public static final String FORMAT_2 = "yyyy/MM/dd";
/**
* @param obj
* 任意对象
* @return String
*/
public static String object2json(Object obj) {
StringBuilder json = new StringBuilder();
if (obj == null) {
json.append("""");
}
else if (obj instanceof String || obj instanceof Integer || obj instanceof Float
|| obj instanceof Boolean || obj instanceof Short || obj instanceof Double
|| obj instanceof Long || obj instanceof BigDecimal
|| obj instanceof BigInteger || obj instanceof Byte) {
json.append(""").append(string2json(obj.toString())).append(""");
}
else if (obj instanceof Date) {
(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")).format(obj);
json.append(""").append(string2json(obj.toString())).append(""");
}
else if (obj instanceof Object[]) {
json.append(array2json((Object[]) obj));
}
else if (obj instanceof List) {
json.append(list2json((List<?>) obj));
}
else if (obj instanceof Map) {
json.append(map2json((Map<?, ?>) obj));
}
else if (obj instanceof Set) {
json.append(set2json((Set<?>) obj));
}
else {
json.append(bean2json(obj));
}
return json.toString();
}
/**
* @param bean
* bean对象
* @return String
*/
public static String bean2json(Object bean) {
StringBuilder json = new StringBuilder();
json.append("{");
PropertyDescriptor[] props = null;
try {
props = Introspector.getBeanInfo(bean.getClass(), Object.class)
.getPropertyDescriptors();
} catch (IntrospectionException e) {
}
if (props != null) {
for (int i = 0; i < props.length; i++) {
try {
String name = object2json(props[i].getName());
String value = object2json(props[i].getReadMethod().invoke(bean));
json.append(name);
json.append(":");
json.append(value);
json.append(",");
} catch (Exception e) {
}
}
json.setCharAt(json.length() - 1, '}');
}
else {
json.append("}");
}
return json.toString();
}
/**
* @param list
* list对象
* @return String
*/
public static String list2json(List<?> list) {
StringBuilder json = new StringBuilder();
json.append("{ "results": " + list.size() + ", "rows": ");
json.append("[");
if (list != null && list.size() > 0) {
for (Object obj : list) {
json.append(object2json(obj));
json.append(",");
}
json.setCharAt(json.length() - 1, ']');
}
else {
json.append("]");
}
json.append("}");
return json.toString();
}
/**
* @param array
* 对象数组
* @return String
*/
public static String array2json(Object[] array) {
StringBuilder json = new StringBuilder();
json.append("[");
if (array != null && array.length > 0) {
for (Object obj : array) {
json.append(object2json(obj));
json.append(",");
}
json.setCharAt(json.length() - 1, ']');
}
else {
json.append("]");
}
return json.toString();
}
/**
* @param map
* map对象
* @return String
*/
public static String map2json(Map<?, ?> map) {
StringBuilder json = new StringBuilder();
json.append("{");
if (map != null && map.size() > 0) {
for (Object key : map.keySet()) {
json.append(object2json(key));
json.append(":");
json.append(object2json(map.get(key)));
json.append(",");
}
json.setCharAt(json.length() - 1, '}');
}
else {
json.append("}");
}
return json.toString();
}
/**
* @param set
* 集合对象
* @return String
*/
public static String set2json(Set<?> set) {
StringBuilder json = new StringBuilder();
json.append("[");
if (set != null && set.size() > 0) {
for (Object obj : set) {
json.append(object2json(obj));
json.append(",");
}
json.setCharAt(json.length() - 1, ']');
}
else {
json.append("]");
}
return json.toString();
}
/**
* @param s
* 参数
* @return String
*/
public static String string2json(String s) {
if (s == null)
return "";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
switch (ch) {
case '"':
sb.append("\"");
break;
case '\':
sb.append("\\");
break;
case '\b':
sb.append("\b");
break;
case '\f':
sb.append("\f");
break;
case '\n':
sb.append("\n");
break;
case '\r':
sb.append("\r");
break;
case '\t':
sb.append("\t");
break;
case '/':
sb.append("\/");
break;
default:
if (ch >= '\u0000' && ch <= '\u001F') {
String ss = Integer.toHexString(ch);
sb.append("\u");
for (int k = 0; k < 4 - ss.length(); k++) {
sb.append('0');
}
sb.append(ss.toUpperCase());
}
else {
sb.append(ch);
}
}
}
return sb.toString();
}
/**
* @param obj
* 要转化的对象
* @param map<"0","fieldName1"> map<"1","fieldName2">
* 需要转化的字段 如果为空,则是全部的字段
* @return
* @throws Exception
*/
public static String beanToJson(Object obj, Map<String, String> map) throws Exception {
JSONArray jsonArray = new JSONArray();
JSONObject bean = new JSONObject();
Class<?> clazz = obj.getClass();
Method[] methods = clazz.getMethods();
Field fields[] = clazz.getDeclaredFields();
for(Field field:fields){
if(map==null){
String fieldName = field.getName();
String getMetName = ReflectUtil.pareGetName(field.getName());
if(!ReflectUtil.checkMethod(methods,getMetName)){
continue;
}
Class<?>[] parameterTypes =null;
Method method = clazz.getMethod(getMetName, parameterTypes);
Object object = method.invoke(obj, new Object[]{});
if(object == null){
object = new String("");
}
bean.element(fieldName,object);
}else {
String fieldName = field.getName();
if (map.containsValue(fieldName)) {
String getMetName = ReflectUtil.pareGetName(field.getName());
if(!ReflectUtil.checkMethod(methods,getMetName)){
continue;
}
Class<?>[] parameterTypes =null;
Method method = clazz.getMethod(getMetName, parameterTypes);
Object object = method.invoke(obj, new Object[]{});
if(object == null){
object = new String("");
}
bean.element(fieldName,object);
}
}
}
jsonArray.add(map);
jsonArray.add(bean);
return jsonArray.toString();
}
/**
* 将字符串转成对象
*
* @param json json字符串
* @param cla 转换成BEAN对应的CLASS
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T json2Bean(String json, Class<T> cla) {
JSONObject jsonObject = JSONObject.fromObject(json);
return (T) JSONObject.toBean(jsonObject, cla);
}
/**
* 将字符串转成对象list
*
* @param <E>
* @param jsonStr
* @param cla
* @return
*/
@SuppressWarnings("unchecked")
public static <E> List<E> json2List(String jsonStr, Class<E> cla) {
List<E> itemList = new ArrayList<E>();
JSONArray jsonarray = JSONArray.fromObject(jsonStr);
for (int i = 0; i < jsonarray.size(); i++) {
JSONObject object = jsonarray.getJSONObject(i);
//注册时间类型
String[] formats = new String[] {"yyyy-MM-dd HH:mm:ss","yyyy/MM/dd HH:mm:ss","yyyy-MM-dd","yyyy/MM/dd"};
JSONUtils.getMorpherRegistry().registerMorpher(new TimestampMorpher(formats));
JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(formats));
E item = (E)JSONObject.toBean(object, cla);
itemList.add(item);
}
return itemList;
}
@SuppressWarnings("unchecked")
public static <E> List<E> json2List(String jsonStr, Class<E> cla,List<ColumnData> columnDatas,List<String> failsList) {
List<E> itemList = new ArrayList<E>();
JSONArray jsonarray = JSONArray.fromObject(jsonStr);
for (int i = 0; i < jsonarray.size(); i++) {
JSONObject object = jsonarray.getJSONObject(i);
//注册时间类型
String[] formats = new String[] {"yyyy-MM-dd HH:mm:ss","yyyy/MM/dd HH:mm:ss","yyyy-MM-dd","yyyy/MM/dd"};
JSONUtils.getMorpherRegistry().registerMorpher(new TimestampMorpher(formats));
JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(formats));
E item = (E)JSONObject.toBean(object, cla);
checkJson2ListFailProperty(object,item,columnDatas,failsList);
itemList.add(item);
}
return itemList;
}
/**
* 校验JSONObject与E中均存在的属性,并且当JSONObject有值但E中没转化成对应的值,记录在错误列表failsList中
* e.g. 日期 “2018-02-30” 转化成对应的DATE值时为空的情况
* @param object json对象
* @param entry 实体对象
* @param columnDatas导入对应的字段说明信息
* @param failsList 转化失败提示信息
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static <E> void checkJson2ListFailProperty(JSONObject object, E entry,List<ColumnData> columnDatas,List<String> failsList){
Field[] fieldArray = entry.getClass().getDeclaredFields();
for(int i=0;i<fieldArray.length;i++) {
//首先判断E中是否存在该属性
fieldArray[i].setAccessible(true);
String propertyName = fieldArray[i].getName();
if(object.containsKey(propertyName)){
ColumnData columnData = findColumnDataByName(columnDatas,propertyName);
try{
if(!StringHelper.isEmpty(object.get(propertyName)) && fieldArray[i].get(entry)==null ){
System.out.println("1:"+propertyName+"---"+object.get(propertyName).toString()+"---");
String hint =columnData==null?"值:"+object.get(propertyName)+"无效,无法转化;":columnData.getColumnTitle()+"值:"+object.get(propertyName)+"无效,无法转化;";
failsList.add(hint);
}
}catch(Exception e){
e.printStackTrace();
failsList.add(e.getMessage());
}
}
}
}
/**
* 根据字段名称找对应的导入列结构信息
* @param columnDatas
* @param fieldName
* @return
*/
public static ColumnData findColumnDataByName(List<ColumnData> columnDatas,String fieldName){
ColumnData result=null;
for(ColumnData columnData:columnDatas){
//如果找到对应的字段
if(columnData.getColumnValue().equals(fieldName)){
result=columnData;
break;
}
}
return result;
}
public static JSONArray toJsonArr(Object obj){
JsonConfig jsonConfig=new JsonConfig();
jsonConfig.registerJsonValueProcessor(ArrayList.class,new JsonDefaultValueProcessor());
return JSONArray.fromObject(obj, jsonConfig);
}
//对于反向应用的实体,则需要传入class,假如需要显示那些属性,可以配置在propertys
public static JSONArray toJsonArr(Object obj,Class clz,String[] propertys){
JsonConfig jsonConfig=new JsonConfig();
jsonConfig.registerJsonValueProcessor(ArrayList.class,new JsonDefaultValueProcessor());
jsonConfig.registerJsonValueProcessor(clz,
new ObjectJsonValueProcessor(propertys,clz));
return JSONArray.fromObject(obj, jsonConfig);
}
public static JSONObject toJsonObject(Object obj){
JsonConfig jsonConfig = new JsonConfig();
//@1:注册时间类型为自定义类型JsonDateValueProcessor
JsonValueProcessor dateValueProcessor = new JsonDefaultValueProcessor();
jsonConfig.registerJsonValueProcessor(java.util.Date.class, dateValueProcessor);
jsonConfig.registerJsonValueProcessor(java.sql.Timestamp.class, dateValueProcessor);
return JSONObject.fromObject(obj, jsonConfig);
}
public static Map<String, Object> parseJSON2Map(String jsonStr) {
Map<String, Object> map = new HashMap<String, Object>();
// 最外层解析
JSONObject json = JSONObject.fromObject(jsonStr);
for (Object k : json.keySet()) {
Object v = json.get(k);
// 如果内层还是数组的话,继续解析
if (v instanceof JSONArray) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Iterator<JSONObject> it = ((JSONArray) v).iterator();
while (it.hasNext()) {
JSONObject json2 = it.next();
list.add(parseJSON2Map(json2.toString()));
}
map.put(k.toString(), list);
} else {
map.put(k.toString(), v);
}
}
return map;
}
/**
* JSON转List集合
*
* @param jsonStr
* @return
*/
public static List<Map<String, Object>> parseJSON2List(String jsonStr) {
JSONArray jsonArr = JSONArray.fromObject(jsonStr);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Iterator<JSONObject> it = jsonArr.iterator();
while (it.hasNext()) {
JSONObject json2 = it.next();
list.add(parseJSON2Map(json2.toString()));
}
return list;
}
}