Browse Source

重写事务示例,使用新的秘钥。

weihf 5 years ago
parent
commit
1c49a3371a

+ 1 - 1
ipu-rest-scaffold/pom.xml

@ -50,7 +50,7 @@
50 50
        <dependency>
51 51
            <groupId>com.ai.ipu</groupId>
52 52
            <artifactId>ipu-nosql</artifactId>
53
            <version>0.0.1-SNAPSHOT</version>
53
            <version>3.1-SNAPSHOT</version>
54 54
        </dependency>
55 55
        <dependency>
56 56
            <groupId>org.mongodb</groupId>

+ 1 - 1
ipu-rest-scaffold/readme.md

@ -24,7 +24,7 @@ SQL被统一存放在classpath的sql路径下,如:sql.ipu.demo。
24 24
使用命名空间+id的方式定位SQL配置,DbSqlMgmtController有代码使用范例。
25 25
###四、ipu-nosql组件
26 26
- 1.ipu-nosql组件的引入
27
    - 以maven为例,请在pom.xml中引入ipu-nosql组件和mongodb驱动包
27
    - 以maven为例,请在pom.xml中引入ipu-nosql组件和mongodb驱动包。如果使用的springboot为2.2.1.RELEASE或更高版本时,则不再需要添加mongodb驱动包。因为该版本已支持3.11.2的mongodb驱动包。
28 28
        ```
29 29
        <dependency>
30 30
            <groupId>com.ai.ipu</groupId>

+ 62 - 16
ipu-rest-scaffold/src/main/java/com/ai/ipu/server/control/MongoDbController.java

@ -1,10 +1,9 @@
1 1
package com.ai.ipu.server.control;
2 2
3
import com.ai.ipu.basic.util.IpuException;
3 4
import com.ai.ipu.basic.util.IpuUtility;
4 5
import com.ai.ipu.data.JMap;
5 6
import com.ai.ipu.data.impl.JsonMap;
6
import com.ai.ipu.nosql.INoSql;
7
import com.ai.ipu.nosql.mongodb.MongoCacheFactory;
8 7
import com.ai.ipu.server.service.MongoDbService;
9 8
import com.ai.ipu.server.util.RestScaffoldConstant;
10 9
import org.springframework.beans.factory.annotation.Autowired;
@ -24,52 +23,99 @@ public class MongoDbController {
24 23
25 24
    private String connName = "data";
26 25
    private String dbName = "test";
27
    private String tableName = "mycol1";
28
26
    
29 27
    @ResponseBody
30
    @RequestMapping("/select")
28
    @RequestMapping("/selectUser")
31 29
    public JMap executeSelect(JMap params) throws Exception {
32 30
        JMap retMap = new JsonMap();
31
        params.put("connName", connName);
32
        params.put("dbName", dbName);
33
        if (!params.containsKey("condParam"))
34
        	params.put("condParam", "{\"name\": \"tom\"}");
35
        
33 36
        try {
34
            retMap = MongoDbService.executeSelect(params,connName,dbName,tableName);
37
        	//单独做查询时,不涉及事务控制,因此service的方法名命名就可以不遵照process开头。
38
            retMap.put("resultList", MongoDbService.executeSelect(params));
39
        } catch (IpuException ie) {
40
        	IpuUtility.error(ie.getMessage());
35 41
        } catch (Exception e) {
36
            IpuUtility.errorCode(RestScaffoldConstant.SERVER_003);
42
            IpuUtility.errorCode(RestScaffoldConstant.SERVER_004);
37 43
        }
38 44
        return retMap;
39 45
    }
40 46
41 47
    @ResponseBody
42
    @RequestMapping("/insert")
48
    @RequestMapping("/insertUser")
43 49
    public JMap executeInsert(JMap params) throws Exception {
44 50
        JMap retMap = new JsonMap();
51
        params.put("connName", connName);
52
        params.put("dbName", dbName);
53
        if (!params.containsKey("operType"))
54
        	params.put("operType", "insertUser");
55
        
45 56
        try {
46
            retMap = MongoDbService.processInsert(params,connName,dbName,tableName);
57
        	/* 涉及事务控制,因此service的方法名命名就要遵照process开头。
58
        	 * 一个process开头的方法里,所有对mongodb的增删改都是一个事务
59
        	 * 如果需要支持多事务,有2种解决方案:
60
        	 * 1、不同的事务使用不同的service方法;参见processInsertUser和processInsertLog
61
        	 * 2、在一个service方法里,直接声明独立事务。参见processInsertUserAndLog
62
        	*/
63
            MongoDbService.processInsertUserAndLog(params);
64
            retMap.put("result", "插入一条用户记录成功");
65
        } catch (IpuException ie) {
66
        	IpuUtility.error(ie.getMessage());
47 67
        } catch (Exception e) {
48
            IpuUtility.errorCode(RestScaffoldConstant.SERVER_003);
68
            IpuUtility.errorCode(RestScaffoldConstant.SERVER_005);
49 69
        }
50 70
        return retMap;
51 71
    }
52 72
53 73
    @ResponseBody
54
    @RequestMapping("/update")
74
    @RequestMapping("/updateUser")
55 75
    public JMap executeUpdate(JMap params) throws Exception {
56 76
        JMap retMap = new JsonMap();
77
        params.put("connName", connName);
78
        params.put("dbName", dbName);
79
        if (!params.containsKey("operType"))
80
        	params.put("operType", "updateUser");
81
        if (!params.containsKey("condParam"))
82
        	params.put("condParam", "{\"name\": \"tom\"}");
83
        
57 84
        try {
58
            retMap = MongoDbService.processUpdate(params,connName,dbName,tableName);
85
            try {
86
            	MongoDbService.processInsertLog(params);
87
            }catch (Exception e1) {}
88
            MongoDbService.processUpdateUser(params);
89
            retMap.put("result", "更改用户记录成功");
90
        } catch (IpuException ie) {
91
        	IpuUtility.error(ie.getMessage());
59 92
        } catch (Exception e) {
60
            IpuUtility.errorCode(RestScaffoldConstant.SERVER_003);
93
            IpuUtility.errorCode(RestScaffoldConstant.SERVER_006);
61 94
        }
62 95
        return retMap;
63 96
    }
64 97
65 98
    @ResponseBody
66
    @RequestMapping("/delete")
99
    @RequestMapping("/deleteUser")
67 100
    public JMap executeDelete(JMap params) throws Exception {
68 101
        JMap retMap = new JsonMap();
102
        params.put("connName", connName);
103
        params.put("dbName", dbName);
104
        if (!params.containsKey("operType"))
105
        	params.put("operType", "deleteUser");
106
        if (!params.containsKey("condParam"))
107
        	params.put("condParam", "{\"name\": \"tom\"}");
108
        
69 109
        try {
70
            retMap = MongoDbService.processDelete(params,connName,dbName,tableName);
110
        	try {
111
            	MongoDbService.processInsertLog(params);
112
            }catch (Exception e1) {}
113
            MongoDbService.processDeleteUser(params);
114
            retMap.put("result", "删除用户记录成功");
115
        } catch (IpuException ie) {
116
        	IpuUtility.error(ie.getMessage());
71 117
        } catch (Exception e) {
72
            IpuUtility.errorCode(RestScaffoldConstant.SERVER_003);
118
            IpuUtility.errorCode(RestScaffoldConstant.SERVER_007);
73 119
        }
74 120
        return retMap;
75 121
    }

+ 11 - 4
ipu-rest-scaffold/src/main/java/com/ai/ipu/server/service/MongoDbService.java

@ -1,18 +1,25 @@
1 1
package com.ai.ipu.server.service;
2 2
3
import java.util.List;
4
3 5
import com.ai.ipu.data.JMap;
4 6
7
5 8
/**
6 9
 * @author miaozy@asiainfo.com
7 10
 */
8 11
public interface MongoDbService {
9 12
10
    JMap executeSelect(JMap params, String connName, String dbName, String tableName) throws Exception;
13
    List<String> executeSelect(JMap params) throws Exception;
11 14
12
    JMap processInsert(JMap params, String connName, String dbName, String tableName) throws Exception;
15
    void processInsertUser(JMap params) throws Exception;
16
    
17
    void processInsertLog(JMap params) throws Exception;
18
    
19
    void processInsertUserAndLog(JMap params) throws Exception;
13 20
14
    JMap processUpdate(JMap params, String connName, String dbName, String tableName) throws Exception;
21
    void processUpdateUser(JMap params) throws Exception;
15 22
16
    JMap processDelete(JMap params, String connName, String dbName, String tableName) throws Exception;
23
    void processDeleteUser(JMap params) throws Exception;
17 24
18 25
}

+ 85 - 22
ipu-rest-scaffold/src/main/java/com/ai/ipu/server/service/impl/MongoDbServiceImpl.java

@ -1,10 +1,16 @@
1 1
package com.ai.ipu.server.service.impl;
2 2
3 3
import com.ai.ipu.data.JMap;
4
import com.ai.ipu.data.impl.JsonMap;
5 4
import com.ai.ipu.nosql.INoSql;
6 5
import com.ai.ipu.nosql.mongodb.MongoCacheFactory;
7 6
import com.ai.ipu.server.service.MongoDbService;
7
import com.alibaba.fastjson.JSONObject;
8
9
import java.util.HashMap;
10
import java.util.List;
11
import java.util.Map;
12
import java.util.Map.Entry;
13
8 14
import org.springframework.stereotype.Service;
9 15
10 16
@ -13,43 +19,100 @@ import org.springframework.stereotype.Service;
13 19
 */
14 20
@Service
15 21
public class MongoDbServiceImpl implements MongoDbService {
16
22
	private String tableUser = "userInfo";
23
	private String tableLog = "operLog";
17 24
18 25
    @Override
19
    public JMap executeSelect(JMap params, String connName, String dbName, String tableName) throws Exception {
20
        JMap retMap = new JsonMap();
26
    public List<String> executeSelect(JMap params) throws Exception {
21 27
        String condParam = params.getString("condParam");
22 28
        String sortParam = params.getString("sortParam") == null ? "{}" : params.getString("sortParam");
23
        INoSql noSql = MongoCacheFactory.getMongoDao(connName, dbName, tableName);
24
        retMap.put("retList", noSql.executeSelect(condParam, sortParam));
25
        return retMap;
29
        INoSql noSql = MongoCacheFactory.getMongoDao(params.getString("connName"), params.getString("dbName"), tableUser);
30
        return noSql.executeSelect(condParam, sortParam);
26 31
    }
27 32
28 33
    @Override
29
    public JMap processInsert(JMap params, String connName, String dbName, String tableName) throws Exception {
30
        JMap retMap = new JsonMap();
31
        INoSql noSql = MongoCacheFactory.getMongoDao(connName, dbName, tableName);
32
        String data = params.getString("data");
33
        noSql.executeInsert(data);
34
        return retMap;
34
    public void processInsertUser(JMap params) throws Exception {
35
        INoSql noSql = MongoCacheFactory.getMongoDao(params.getString("connName"), params.getString("dbName"), tableUser);
36
        noSql.executeInsert(buildUser(params));
37
    }
38
    
39
    @Override
40
    public void processInsertLog(JMap params) throws Exception {
41
        INoSql noSql = MongoCacheFactory.getMongoDao(params.getString("connName"), params.getString("dbName"), tableLog);
42
        noSql.executeInsert(buildLog(params));
43
    }
44
    
45
    @Override
46
    public void processInsertUserAndLog(JMap params) throws Exception {
47
        INoSql noSql = MongoCacheFactory.getMongoDao(params.getString("connName"), params.getString("dbName"), tableLog);
48
        noSql.executeInsert(buildLog(params));
49
        //声明独立事务。operLog和userInfo是不同事务,userInfo插入失败不会回滚operLog。
50
        //如果不声明,则operLog和userInfo是同一事务;只要任何一个插入失败,则全部做事务回滚。
51
        MongoCacheFactory.commit(params.getString("connName"), params.getString("dbName"), tableLog);
52
        MongoCacheFactory.clear(params.getString("connName"), params.getString("dbName"), tableLog);
53
        
54
        noSql = MongoCacheFactory.getMongoDao(params.getString("connName"), params.getString("dbName"), tableUser);
55
        noSql.executeInsert(buildUser(params));
35 56
    }
36 57
37 58
    @Override
38
    public JMap processUpdate(JMap params, String connName, String dbName, String tableName) throws Exception {
39
        JMap retMap = new JsonMap();
59
    public void processUpdateUser(JMap params) throws Exception {
40 60
        String condParam = params.getString("condParam");
41
        String updateField = params.getString("updateField");
42
        INoSql noSql = MongoCacheFactory.getMongoDao(connName, dbName, tableName);
61
        String updateField = buildUser(params);
62
        INoSql noSql = MongoCacheFactory.getMongoDao(params.getString("connName"), params.getString("dbName"), tableUser);
43 63
        noSql.executeUpdateMany(condParam, updateField);
44
        return retMap;
45 64
    }
46 65
47 66
    @Override
48
    public JMap processDelete(JMap params, String connName, String dbName, String tableName) throws Exception {
49
        JMap retMap = new JsonMap();
67
    public void processDeleteUser(JMap params) throws Exception {
50 68
        String condParam = params.getString("condParam");
51
        INoSql noSql = MongoCacheFactory.getMongoDao(connName, dbName, tableName);
69
        INoSql noSql = MongoCacheFactory.getMongoDao(params.getString("connName"), params.getString("dbName"), tableUser);
52 70
        noSql.executeDeleteMany(condParam);
53
        return retMap;
71
    }
72
    
73
    private String buildUser(JMap params) {
74
    	StringBuffer result = new StringBuffer();
75
    	if (params.containsKey("data"))
76
    		result.append(params.getString("data"));
77
        else
78
        {
79
        	JSONObject data = new JSONObject();
80
        	for(Entry<String, Object> entry : params.entrySet()){
81
        		if (entry.getKey().equals("connName") || 
82
        				entry.getKey().equals("dbName") ||
83
        				entry.getKey().startsWith("oper") ||
84
        				entry.getKey().startsWith("cond"))       		
85
        			continue;
86
        		
87
        		data.put(entry.getKey(), entry.getValue());	
88
        	}
89
        	if (data.isEmpty())
90
        	{
91
        		data.put("name", "tom");
92
        		data.put("male", true);
93
        		Map info = new HashMap();
94
        		info.put("city", "beijing");
95
        		info.put("tag", "[\"tennis\",\"football\", \"travel\"]");
96
        		data.put("info", info);
97
        	}
98
        	result.append(data.toJSONString());
99
        }
100
    	return result.toString();
101
    }
102
    
103
    private String buildLog(JMap params) {
104
    	JSONObject data = new JSONObject();
105
    	for(Entry<String, Object> entry : params.entrySet()){
106
    		if (entry.getKey().equals("connName") || 
107
    				entry.getKey().equals("dbName") ||
108
    				entry.getKey().startsWith("oper") ||
109
    				entry.getKey().startsWith("cond"))       		
110
    		{
111
    			data.put(entry.getKey(), entry.getValue());
112
    		}
113
    		
114
    			
115
    	}
116
    	return data.toJSONString();
54 117
    }
55 118
}

+ 19 - 15
ipu-rest-scaffold/src/main/java/com/ai/ipu/server/util/RestScaffoldConstant.java

@ -1,15 +1,19 @@
1
package com.ai.ipu.server.util;
2
3
/**
4
 * @author huangbo@asiainfo.com
5
 * @team IPU
6
 * @date 2019年11月20日下午3:14:00
7
 * @desc 常量类。工程名(驼峰)+Constant
8
 */
9
public class RestScaffoldConstant {
10
11
    /*异常编码*/
12
    public static final String SERVER_001 = "SERVER_001";
13
    public static final String SERVER_002 = "SERVER_002";
14
    public static final String SERVER_003 = "SERVER_003";
15
}
1
package com.ai.ipu.server.util;
2

3
/**
4
 * @author huangbo@asiainfo.com
5
 * @team IPU
6
 * @date 2019年11月20日下午3:14:00
7
 * @desc 常量类。工程名(驼峰)+Constant
8
 */
9
public class RestScaffoldConstant {
10

11
    /*异常编码*/
12
    public static final String SERVER_001 = "SERVER_001";
13
    public static final String SERVER_002 = "SERVER_002";
14
    public static final String SERVER_003 = "SERVER_003";
15
    public static final String SERVER_004 = "SERVER_004";
16
    public static final String SERVER_005 = "SERVER_005";
17
    public static final String SERVER_006 = "SERVER_006";
18
    public static final String SERVER_007 = "SERVER_007";
19
}

+ 2 - 2
ipu-rest-scaffold/src/main/resources/dev/ipu-nosql.xml

@ -17,9 +17,9 @@
17 17
        <config name="userName" value="ipuOper"/>
18 18
        <!-- 加密后的用户密码,不做身份验证时可空;身份认证时必填 -->
19 19
        <!-- 加密算法需要用一对@@包含,并且放在密码的最前面。如果没有发现加密算法,则为明文密码  -->
20
        <config name="encryptedPasswd" value="@DES@cMBWCqZgG39bQ+PyRkJ4sw=="/>
20
        <config name="encryptedPasswd" value="@DES@cqKYnoRap2YV9L7xEQ4fyw=="/>
21 21
        <!-- 解密秘钥 ,可为空 -->
22
        <config name="decryptedKey" value="325m@#$rt4vt"/>
22
        <config name="decryptedKey" value="Mongo4@121#_3$"/>
23 23
        <!-- 自定义解密算法需要在pom.xml里引入所需jar,并在此声明带全包名的类 -->
24 24
        <config name="decryptedClass" value="com.ai.ipu.nosql.util.DecryptUtil"/>
25 25
        <!-- 自定义解密算法的解密算法,加密后的秘钥(可为空,为空则只有1个参数)、密码串是算法的2个参数  -->

+ 7 - 3
ipu-rest-scaffold/src/main/resources/exception_messages_zh_CN.properties

@ -1,3 +1,7 @@
1
SERVER_001=条件参数不能为空
2
SERVER_002=[%v]参数异常
3
SERVER_003=业务办理失败:主键冲突
1
SERVER_001=条件参数不能为空
2
SERVER_002=[%v]参数异常
3
SERVER_003=业务办理失败:主键冲突
4
SERVER_004=查询失败
5
SERVER_005=插入失败
6
SERVER_006=更改失败
7
SERVER_007=删除失败