1、新增自定义异常捕获处理类

2、新增保存“业务数据”逻辑:
This commit is contained in:
2019-06-13 16:53:19 +08:00
parent 61a90c8591
commit 60566a69c9
16 changed files with 184 additions and 30 deletions

View File

@@ -0,0 +1,22 @@
package net.tccn.base;
import org.redkale.net.http.HttpRequest;
/**
* 自定义异常处理
* @author: liangxianyou
*/
public class CfgException extends IllegalArgumentException {
public CfgException(String msg) {
super(msg);
}
public CfgException(String msgTpl, Object ... objects) {
super(String.format(msgTpl, objects));
}
public void log(HttpRequest request) {
System.out.printf("CfgException: {uri: %s,%n Parameters:%s,%n body: %s} %n", request.getRequestURI(), request.getParameters().toString(), request.getBody());
}
}

View File

@@ -48,7 +48,7 @@ public class Kv<K,V> extends LinkedHashMap<K,V> {
filedS= arr[1]; filedS= arr[1];
} }
Method method = m.getClass().getDeclaredMethod("get" + Liangs.toUpperCaseFirst(filedS)); Method method = m.getClass().getDeclaredMethod("get" + X.toUpperCaseFirst(filedS));
if (method != null) { if (method != null) {
kv.set(filedT, method.invoke(m)); kv.set(filedT, method.invoke(m));
} }

View File

@@ -2,7 +2,7 @@ package net.tccn.base;
import lombok.Getter; import lombok.Getter;
import net.tccn.base.arango.Doc; import net.tccn.base.arango.Doc;
import net.tccn.dbq.Field; import net.tccn.dbq.table.Field;
import net.tccn.dbq.fbean.FilterType; import net.tccn.dbq.fbean.FilterType;
import net.tccn.dbq.jdbc.api.DbAccount; import net.tccn.dbq.jdbc.api.DbAccount;
import net.tccn.dbq.jdbc.api.DbKit; import net.tccn.dbq.jdbc.api.DbKit;
@@ -140,6 +140,17 @@ public final class MetaKit {
} }
} }
/**
* 得到业务主表
* @param serviceName
* @param token
* @return
*/
public static MetaTable getMainTable(String serviceName, String token) {
MetaService metaService = MetaKit.getMetaService(serviceName, token);
return MetaKit.getMetaTableByAlias(metaService.getTable());
}
// ----------------------------------- // -----------------------------------
public void cleanData() { public void cleanData() {
@@ -434,7 +445,7 @@ public final class MetaKit {
Set<String> allAlias; Set<String> allAlias;
if (!all) { if (!all) {
allAlias = Liangs.concat( allAlias = X.concat(
metaService.getFilters().stream().map(f -> { metaService.getFilters().stream().map(f -> {
String col = (String) f.getName(); String col = (String) f.getName();
String alias = col.split("[.]")[0]; String alias = col.split("[.]")[0];

View File

@@ -8,7 +8,7 @@ import java.util.stream.Stream;
/** /**
* Created by liangxianyou at 2019/3/19 18:01. * Created by liangxianyou at 2019/3/19 18:01.
*/ */
public class Liangs { public class X {
/** /**
* 将集合数组合并到一个Set<T> 集合中 * 将集合数组合并到一个Set<T> 集合中
@@ -85,4 +85,18 @@ public class Liangs {
return null; return null;
} }
public static boolean isEmpty(Object obj) {
if (obj == null)
return true;
if (obj instanceof List)
return ((List) obj).isEmpty();
if (obj instanceof String)
return ((String) obj).isEmpty();
if (obj instanceof Map)
return ((Map) obj).isEmpty();
if (obj instanceof Collection)
return ((Collection) obj).isEmpty();
return false;
}
} }

View File

@@ -13,18 +13,19 @@ import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
/**
* Db 调度层
*/
public class DbExecutors { public class DbExecutors {
private final static ParseMysql PARSER = new ParseMysql(); private final static ParseMysql PARSER = new ParseMysql();
public static PageBean findPage(FBean fBean) throws ExecutionException, InterruptedException { public static PageBean findPage(FBean fBean) throws ExecutionException, InterruptedException {
//sql解析 //sql解析
String[] sqls = PARSER.parse(fBean); String[] sqls = PARSER.parseList(fBean);
//当前的业务 => 获取主表 信息 => 数据源信息 => 数据源对象 => 创建数据工具对象 => 查询数据 //当前的业务 => 获取主表 信息 => 数据源信息 => 数据源对象 => 创建数据工具对象 => 查询数据
MetaService metaService = MetaKit.getMetaService(fBean.getName(), fBean.getPlatToken()); MetaService metaService = MetaKit.getMetaService(fBean.getName(), fBean.getPlatToken());
MetaTable mainTable = MetaKit.getMetaTableByAlias(metaService.getTable()); MetaTable mainTable = MetaKit.getMetaTableByAlias(metaService.getTable());
DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId(), mainTable.getCatalog()); DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId(), mainTable.getCatalog());
//System.out.printf("----------------%n countSql:%s%n findSql:%s%n----------------%n", sqls[0], sqls[1]); //System.out.printf("----------------%n countSql:%s%n findSql:%s%n----------------%n", sqls[0], sqls[1]);
@@ -39,12 +40,18 @@ public class DbExecutors {
public static void del(String name, Map data, String token) { public static void del(String name, Map data, String token) {
MetaService metaService = MetaKit.getMetaService(name, token); MetaService metaService = MetaKit.getMetaService(name, token);
MetaTable mainTable = MetaKit.getMetaTableByAlias(metaService.getTable()); MetaTable mainTable = MetaKit.getMetaTableByAlias(metaService.getTable());
DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId(), mainTable.getCatalog()); DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId(), mainTable.getCatalog());
String delSql = PARSER.parseDel(name, data, token); String delSql = PARSER.parseDel(name, data, token);
dbKit.exetute(delSql); dbKit.exetute(delSql);
} }
public static void save(String name, Map data, String token) {
MetaTable mainTable = MetaKit.getMainTable(name, token);
DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId(), mainTable.getCatalog());
String sql = PARSER.parseSave(name, data, token);
dbKit.exetute(sql);
}
} }

View File

@@ -1,11 +1,12 @@
package net.tccn.dbq.jdbc.api; package net.tccn.dbq.jdbc.api;
import net.tccn.base.Liangs; import net.tccn.base.X;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
/** /**
* Db 最终执行层
* Created by liangxianyou at 2019/3/12 14:11. * Created by liangxianyou at 2019/3/12 14:11.
*/ */
public class DbKit implements DbSource{ public class DbKit implements DbSource{
@@ -17,7 +18,7 @@ public class DbKit implements DbSource{
/*public DbKit(DbAccount dbAccount) { /*public DbKit(DbAccount dbAccount) {
this.dbAccount = dbAccount; this.dbAccount = dbAccount;
try { try {
DbSource dbSource = Liangs.getDbSource(DbSource.class, dbAccount.getCate()); DbSource dbSource = X.getDbSource(DbSource.class, dbAccount.getCate());
dbSource.setDbAccount(dbAccount); dbSource.setDbAccount(dbAccount);
this.dbSource = dbSource; this.dbSource = dbSource;
@@ -30,7 +31,7 @@ public class DbKit implements DbSource{
this.catalog = catalog; this.catalog = catalog;
try { try {
DbSource dbSource = Liangs.getDbSource(DbSource.class, dbAccount.getCate()); DbSource dbSource = X.getDbSource(DbSource.class, dbAccount.getCate());
dbSource.setDbAccount(dbAccount); dbSource.setDbAccount(dbAccount);
dbSource.setCatalog(catalog); dbSource.setCatalog(catalog);

View File

@@ -8,7 +8,7 @@ import net.tccn.dbq.fbean.FBean;
public class ParseArango implements Parser { public class ParseArango implements Parser {
@Override @Override
public String[] parse(FBean fBean) { public String[] parseList(FBean fBean) {
return new String[0]; return new String[0];
} }
} }

View File

@@ -9,7 +9,7 @@ public class ParseEs implements Parser {
@Override @Override
public String[] parse(FBean fBean) { public String[] parseList(FBean fBean) {
return new String[0]; return new String[0];
} }
} }

View File

@@ -1,8 +1,6 @@
package net.tccn.dbq.parser; package net.tccn.dbq.parser;
import net.tccn.base.Kv; import net.tccn.base.*;
import net.tccn.base.MetaKit;
import net.tccn.base.TplKit;
import net.tccn.dbq.fbean.*; import net.tccn.dbq.fbean.*;
import net.tccn.meta.MetaLink; import net.tccn.meta.MetaLink;
import net.tccn.meta.MetaService; import net.tccn.meta.MetaService;
@@ -48,8 +46,13 @@ public class ParseMysql implements Parser {
return true; return true;
}; };
/**
* 查询数据解析
* @param fBean
* @return
*/
@Override @Override
public String[] parse(FBean fBean) { public String[] parseList(FBean fBean) {
MetaService metaService = MetaKit.getMetaService(fBean.getName(), fBean.getPlatToken()); MetaService metaService = MetaKit.getMetaService(fBean.getName(), fBean.getPlatToken());
Kv<String, MetaTable> tables = MetaKit.getMetaTables(metaService, false);//所有的关联表信息 Kv<String, MetaTable> tables = MetaKit.getMetaTables(metaService, false);//所有的关联表信息
@@ -134,6 +137,13 @@ public class ParseMysql implements Parser {
return null; return null;
} }
/**
* 删除执行语句解析
* @param name
* @param data
* @param token
* @return
*/
public String parseDel(String name, Map data, String token) { public String parseDel(String name, Map data, String token) {
MetaService metaService = MetaKit.getMetaService(name, token); MetaService metaService = MetaKit.getMetaService(name, token);
Map<String, String> dels = metaService.getDels(); Map<String, String> dels = metaService.getDels();
@@ -151,4 +161,67 @@ public class ParseMysql implements Parser {
return sql; return sql;
} }
/**
* 保存数据解析逻辑:
* 1.得到主表信息
* 2.根据主表信息 使用数据创建sql
* @param serviceName 业务名称
* @param data 待保存的数据
* @param token 平台token
* @return sql 待执行的sql语句
*/
public String parseSave(String serviceName, Map<String, String> data, String token) {
MetaTable mainTable = MetaKit.getMainTable(serviceName, token);
String alias = mainTable.getAlias();
String[] pks = mainTable.pk();
// 取出有效的数据key
List<String> keys = data.keySet()
.stream()
.filter(x ->
x.startsWith(alias + ".") || !X.isEmpty(data.get(alias + "." + x))
).collect(Collectors.toList());
if (pks.length == 0) {
throw new CfgException("保存数据失败,检查业务主表[%s-%S]主键配置", mainTable.getName(), mainTable.getComment());
} else if (keys.size() == 0) {
throw new CfgException("保存数据失败,提交数据不能改空");
}
//单主键
String pv = data.get(alias + "." + pks[0]);
if (X.isEmpty(pv)) { //新增
String sqlTpl = "INSERT INTO `%s` (%s) VALUES %s;"; // para: table、 ks、 vs
StringBuffer ks = new StringBuffer();// `k1`,`k2`,`k3`, ...
StringBuffer vs = new StringBuffer();// `v1`,`v2`,`v3`, ...
for (String k : keys) {
ks.append(String.format("`%s`,", k));
vs.append(String.format("'%s',", data.get(alias + "." + k)));
}
if (ks.length() > 0) {
ks.deleteCharAt(ks.length() - 1);
vs.deleteCharAt(vs.length() - 1);
}
return String.format(sqlTpl, mainTable.getName(), ks, vs);
}
else { //修改
String sqlTpl = "update `%s` set %s where `%s` = '%s';"; // para: table、 kvs、 pk、 pv
StringBuilder kvs = new StringBuilder(); // `k1`='v1',`k2`='v2', ...
String pk = pks[0];
for (String k : keys) {
kvs.append(String.format("`%s`='%s',", k, data.get(alias + "." + k)));
}
if (kvs.length() > 0) {
kvs.deleteCharAt(kvs.length() - 1);
}
return String.format(sqlTpl, mainTable.getName(), kvs, pk, pv);
}
}
} }

View File

@@ -3,6 +3,7 @@ package net.tccn.dbq.parser;
import net.tccn.dbq.fbean.FBean; import net.tccn.dbq.fbean.FBean;
/** /**
* Db 执行解释层
* Created by liangxianyou at 2018/12/24 15:47. * Created by liangxianyou at 2018/12/24 15:47.
*/ */
public interface Parser { public interface Parser {
@@ -12,13 +13,8 @@ public interface Parser {
* @param fBean * @param fBean
* @return [countSql, listSql] * @return [countSql, listSql]
*/ */
String[] parse(FBean fBean); String[] parseList(FBean fBean);
/**
* 解析一个查询条件
* @param filter
*/
//String parse(Filter filter);
/** /**
* 解析入库语句 * 解析入库语句

View File

@@ -1,7 +1,6 @@
package net.tccn.dbq; package net.tccn.dbq.table;
import lombok.Data; import lombok.Data;
import net.tccn.dbq.table.Column;
/** /**
* @author: liangxianyou at 2018/10/17 17:24. * @author: liangxianyou at 2018/10/17 17:24.

View File

@@ -2,11 +2,12 @@ package net.tccn.meta;
import lombok.Data; import lombok.Data;
import net.tccn.base.arango.Doc; import net.tccn.base.arango.Doc;
import net.tccn.dbq.Field; import net.tccn.dbq.table.Field;
import javax.persistence.Table; import javax.persistence.Table;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -40,4 +41,17 @@ public class MetaTable extends Doc<MetaTable> implements Serializable {
return _bean; return _bean;
} }
// 方法名getPK 报错,
public String[] pk() {
List<String> pks = items.stream().filter(x -> x.getPk() != null && x.getPk()).map(x -> x.getName()).collect(Collectors.toList());
if (pks.size() > 0) {
return pks.toArray(new String[pks.size()]);
}
//存在id字段取id
Optional<Field> any = items.stream().filter(x -> x.getName().equalsIgnoreCase("id")).findAny();
return any.isPresent() ? new String[]{"id"} : new String[0];
}
} }

View File

@@ -3,7 +3,7 @@ package net.tccn.service;
import net.tccn.base.JBean; import net.tccn.base.JBean;
import net.tccn.base.Kv; import net.tccn.base.Kv;
import net.tccn.base.MetaKit; import net.tccn.base.MetaKit;
import net.tccn.dbq.Field; import net.tccn.dbq.table.Field;
import net.tccn.meta.*; import net.tccn.meta.*;
import net.tccn.plat.SysPlat; import net.tccn.plat.SysPlat;
import org.redkale.net.http.RestMapping; import org.redkale.net.http.RestMapping;

View File

@@ -4,7 +4,7 @@ import net.tccn.base.ExcelKit;
import net.tccn.base.JBean; import net.tccn.base.JBean;
import net.tccn.base.Kv; import net.tccn.base.Kv;
import net.tccn.base.MetaKit; import net.tccn.base.MetaKit;
import net.tccn.dbq.Field; import net.tccn.dbq.table.Field;
import net.tccn.meta.MetaTable; import net.tccn.meta.MetaTable;
import net.tccn.plat.SysPlat; import net.tccn.plat.SysPlat;
import org.redkale.net.http.RestMapping; import org.redkale.net.http.RestMapping;

View File

@@ -1,6 +1,7 @@
package net.tccn.servlet; package net.tccn.servlet;
import com.arangodb.ArangoDBException; import com.arangodb.ArangoDBException;
import net.tccn.base.CfgException;
import net.tccn.base.JBean; import net.tccn.base.JBean;
import net.tccn.base.Kv; import net.tccn.base.Kv;
import net.tccn.base.arango.ArangoSource; import net.tccn.base.arango.ArangoSource;
@@ -73,6 +74,12 @@ public class BaseServlet extends HttpServlet {
} catch (UnsupportedOperationException e) { } catch (UnsupportedOperationException e) {
e.printStackTrace(); e.printStackTrace();
response.finish(JBean.by(-1, e.getMessage())); response.finish(JBean.by(-1, e.getMessage()));
} catch (CfgException e) { // 系统元数据配置异常
e.printStackTrace();
System.out.println("-------------------------------------------");
e.log(request);
System.out.println("-------------------------------------------");
response.finish(JBean.by(-1, e.getMessage()));
} }
} }

View File

@@ -60,7 +60,7 @@ public class RunTest<T> {
//FBean fBean = new Gson().fromJson(str, FBean.class); //FBean fBean = new Gson().fromJson(str, FBean.class);
FBean fBean = convert.convertFrom(FBean.class, str); FBean fBean = convert.convertFrom(FBean.class, str);
String[] parse = parser.parse(fBean); String[] parse = parser.parseList(fBean);
System.out.println("count:" + parse[0]); System.out.println("count:" + parse[0]);
System.out.println("list:" + parse[1]); System.out.println("list:" + parse[1]);
@@ -370,4 +370,14 @@ public class RunTest<T> {
System.out.println("end"); System.out.println("end");
} }
@Test
public void exceptionTest() {
try {
throw new CfgException("hello exception: %s - %s - %s", 1, 2, "x");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
} }