1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.cdi;
17
18 import jakarta.enterprise.context.spi.CreationalContext;
19
20 import java.io.IOException;
21 import java.io.ObjectInputStream;
22 import java.io.ObjectOutputStream;
23 import java.io.Serializable;
24 import java.lang.reflect.InvocationHandler;
25 import java.lang.reflect.InvocationTargetException;
26 import java.lang.reflect.Method;
27
28 import org.apache.ibatis.session.SqlSessionFactory;
29
30
31
32
33 public class SerializableMapperProxy<T> implements InvocationHandler, Serializable {
34
35 private static final long serialVersionUID = 1L;
36
37 private transient Object mapper;
38
39 private final MyBatisBean bean;
40
41 private final CreationalContext<T> creationalContext;
42
43
44
45
46
47
48
49
50
51 public SerializableMapperProxy(MyBatisBean bean, CreationalContext<T> creationalContext) {
52 this.bean = bean;
53 this.creationalContext = creationalContext;
54 this.mapper = getMapper();
55 }
56
57 @Override
58 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
59 try {
60 return method.invoke(this.mapper, args);
61 } catch (InvocationTargetException e) {
62 throw e.getTargetException();
63 }
64 }
65
66 private Object getMapper() {
67 SqlSessionFactory factory = CDIUtils.findSqlSessionFactory(this.bean.sqlSessionFactoryName, this.bean.qualifiers,
68 this.creationalContext);
69 return CDIUtils.getRegistry(this.creationalContext).getManager(factory).getMapper(this.bean.type);
70 }
71
72 private void readObject(ObjectInputStream is) throws ClassNotFoundException, IOException {
73 is.defaultReadObject();
74 this.mapper = getMapper();
75 }
76
77 private void writeObject(ObjectOutputStream os) throws IOException {
78 os.defaultWriteObject();
79 }
80
81 }