Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
schbrain-canal
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
framework
schbrain-canal
Commits
ef82e907
Commit
ef82e907
authored
Oct 17, 2023
by
panwangnan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改类型转换
parent
6eec5c05
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
48 additions
and
46 deletions
+48
-46
schbrain-canal-client/src/main/java/com/schbrain/canal/client/core/MethodArgumentResolver.java
...om/schbrain/canal/client/core/MethodArgumentResolver.java
+48
-46
No files found.
schbrain-canal-client/src/main/java/com/schbrain/canal/client/core/MethodArgumentResolver.java
View file @
ef82e907
package
com.schbrain.canal.client.core
;
package
com.schbrain.canal.client.core
;
import
cn.hutool.core.convert.Convert
;
import
cn.hutool.core.convert.ConvertException
;
import
com.schbrain.canal.client.event.ResolverCanalEvent
;
import
com.schbrain.canal.client.event.ResolverCanalEvent
;
import
com.schbrain.canal.client.exception.CanalClientException
;
import
com.schbrain.canal.client.exception.CanalClientException
;
import
com.schbrain.canal.client.exception.ReflectionException
;
import
com.schbrain.canal.client.exception.ReflectionException
;
import
com.schbrain.canal.client.reflector.DefaultObjectFactory
;
import
com.schbrain.canal.client.reflector.DefaultReflectorFactory
;
import
com.schbrain.canal.client.reflector.DefaultReflectorFactory
;
import
com.schbrain.canal.client.reflector.Reflector
;
import
com.schbrain.canal.client.reflector.Reflector
;
import
com.schbrain.canal.client.reflector.ReflectorFactory
;
import
com.schbrain.canal.client.reflector.ReflectorFactory
;
import
com.schbrain.canal.client.reflector.DefaultObjectFactory
;
import
com.schbrain.canal.client.transfer.ObjectFactory
;
import
com.schbrain.canal.client.transfer.ObjectFactory
;
import
com.schbrain.canal.client.type.TypeHandler
;
import
com.schbrain.canal.client.type.TypeHandler
;
import
com.schbrain.canal.client.type.TypeHandlerRegister
;
import
com.schbrain.canal.client.type.TypeHandlerRegister
;
...
@@ -18,11 +20,13 @@ import java.lang.reflect.InvocationTargetException;
...
@@ -18,11 +20,13 @@ import java.lang.reflect.InvocationTargetException;
import
java.lang.reflect.ParameterizedType
;
import
java.lang.reflect.ParameterizedType
;
import
java.lang.reflect.Type
;
import
java.lang.reflect.Type
;
import
java.text.ParseException
;
import
java.text.ParseException
;
import
java.util.*
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
/**
* @author zhuyf
* @author zhuyf
* @date 2022/6/21
*/
*/
@Slf4j
@Slf4j
public
class
MethodArgumentResolver
{
public
class
MethodArgumentResolver
{
...
@@ -35,45 +39,40 @@ public class MethodArgumentResolver {
...
@@ -35,45 +39,40 @@ public class MethodArgumentResolver {
/**
/**
* 获取参数类
* 获取参数类
* @param event
* @return
*/
*/
public
Class
getArgumentClass
(
ResolverCanalEvent
<?>
event
)
{
public
Class
getArgumentClass
(
ResolverCanalEvent
<?>
event
)
{
if
(!
classNameMappingClass
.
containsKey
(
event
))
{
if
(!
classNameMappingClass
.
containsKey
(
event
))
{
//接口泛型缓存
//
接口泛型缓存
boolean
cache
=
interfaceGeneric
(
event
);
boolean
cache
=
interfaceGeneric
(
event
);
if
(!
cache
)
{
if
(!
cache
)
{
//继承类泛型缓存
//
继承类泛型缓存
cache
=
extendGeneric
(
event
);
cache
=
extendGeneric
(
event
);
}
}
if
(!
cache
)
{
if
(!
cache
)
{
CanalClientException
e
=
new
CanalClientException
(
event
.
getClass
()
+
"generic get exception"
);
CanalClientException
e
=
new
CanalClientException
(
event
.
getClass
()
+
"generic get exception"
);
log
.
error
(
"generic get exception"
,
e
);
log
.
error
(
"generic get exception"
,
e
);
throw
e
;
throw
e
;
}
}
}
}
return
classNameMappingClass
.
get
(
event
);
return
classNameMappingClass
.
get
(
event
);
}
}
/**
/**
* 接口泛型缓存
* 接口泛型缓存
* @param event
* @return
*/
*/
private
boolean
interfaceGeneric
(
ResolverCanalEvent
<?>
event
){
private
boolean
interfaceGeneric
(
ResolverCanalEvent
<?>
event
)
{
Type
[]
types
=
event
.
getClass
().
getGenericInterfaces
();
Type
[]
types
=
event
.
getClass
().
getGenericInterfaces
();
if
(
types
==
null
||
types
.
length
==
0
)
{
if
(
types
==
null
||
types
.
length
==
0
)
{
return
false
;
return
false
;
}
}
for
(
Type
type
:
types
)
{
for
(
Type
type
:
types
)
{
if
(!(
type
instanceof
ParameterizedType
))
{
if
(!(
type
instanceof
ParameterizedType
))
{
continue
;
continue
;
}
}
ParameterizedType
parameterized
=
(
ParameterizedType
)
type
;
ParameterizedType
parameterized
=
(
ParameterizedType
)
type
;
Type
rawType
=
parameterized
.
getRawType
();
Type
rawType
=
parameterized
.
getRawType
();
if
(
rawType
.
equals
(
ResolverCanalEvent
.
class
))
{
if
(
rawType
.
equals
(
ResolverCanalEvent
.
class
))
{
Class
clazz
=
(
Class
)
parameterized
.
getActualTypeArguments
()[
0
];
Class
clazz
=
(
Class
)
parameterized
.
getActualTypeArguments
()[
0
];
classNameMappingClass
.
put
(
event
,
clazz
);
classNameMappingClass
.
put
(
event
,
clazz
);
return
true
;
return
true
;
}
}
...
@@ -81,63 +80,66 @@ public class MethodArgumentResolver {
...
@@ -81,63 +80,66 @@ public class MethodArgumentResolver {
return
false
;
return
false
;
}
}
private
boolean
extendGeneric
(
ResolverCanalEvent
<?>
event
){
private
boolean
extendGeneric
(
ResolverCanalEvent
<?>
event
)
{
Class
c
=
event
.
getClass
();
Class
c
=
event
.
getClass
();
while
(
true
)
{
while
(
true
)
{
Type
type
=
c
.
getGenericSuperclass
();
Type
type
=
c
.
getGenericSuperclass
();
if
(
type
instanceof
ParameterizedType
)
{
if
(
type
instanceof
ParameterizedType
)
{
ParameterizedType
parameterizedType
=
(
ParameterizedType
)
type
;
ParameterizedType
parameterizedType
=
(
ParameterizedType
)
type
;
Type
[]
types
=
parameterizedType
.
getActualTypeArguments
();
Type
[]
types
=
parameterizedType
.
getActualTypeArguments
();
if
(
types
!=
null
&&
types
.
length
>
0
)
{
if
(
types
!=
null
&&
types
.
length
>
0
)
{
classNameMappingClass
.
put
(
event
,
(
Class
)
types
[
0
]);
classNameMappingClass
.
put
(
event
,
(
Class
)
types
[
0
]);
return
true
;
return
true
;
}
}
}
}
c
=
c
.
getSuperclass
();
c
=
c
.
getSuperclass
();
if
(
type
.
equals
(
Object
.
class
))
{
if
(
type
.
equals
(
Object
.
class
))
{
break
;
break
;
}
}
}
}
return
false
;
return
false
;
}
}
public
List
<
EditMetaInfo
>
resolver
(
ResolverCanalEvent
event
,
Dml
dml
)
throws
InvocationTargetException
,
IllegalAccessException
,
ParseException
,
ReflectionException
{
public
List
<
EditMetaInfo
>
resolver
(
ResolverCanalEvent
event
,
Dml
dml
)
throws
InvocationTargetException
,
IllegalAccessException
,
ParseException
,
ReflectionException
{
Class
c
=
getArgumentClass
(
event
);
Class
c
=
getArgumentClass
(
event
);
List
<
EditMetaInfo
>
editMetaInfos
=
new
ArrayList
<>();
List
<
EditMetaInfo
>
editMetaInfos
=
new
ArrayList
<>();
List
<
Dml
.
Row
>
datas
=
dml
.
getData
();
List
<
Dml
.
Row
>
datas
=
dml
.
getData
();
for
(
Dml
.
Row
row
:
datas
)
{
for
(
Dml
.
Row
row
:
datas
)
{
EditMetaInfo
metaInfo
=
new
EditMetaInfo
();
EditMetaInfo
metaInfo
=
new
EditMetaInfo
();
Object
after
=
columnsConvertObject
(
c
,
row
.
getData
());
Object
after
=
columnsConvertObject
(
c
,
row
.
getData
());
metaInfo
.
setAfter
(
after
);
metaInfo
.
setAfter
(
after
);
Object
before
=
columnsConvertObject
(
c
,
row
.
getOld
());
Object
before
=
columnsConvertObject
(
c
,
row
.
getOld
());
metaInfo
.
setBefore
(
before
);
metaInfo
.
setBefore
(
before
);
editMetaInfos
.
add
(
metaInfo
);
editMetaInfos
.
add
(
metaInfo
);
}
}
return
editMetaInfos
;
return
editMetaInfos
;
}
}
public
Object
columnsConvertObject
(
Class
c
,
Map
<
String
,
Object
>
columns
)
throws
ReflectionException
,
InvocationTargetException
,
IllegalAccessException
,
ParseException
{
public
Object
columnsConvertObject
(
Class
c
,
Map
<
String
,
Object
>
columns
)
throws
ReflectionException
,
InvocationTargetException
,
IllegalAccessException
,
ParseException
{
if
(
columns
==
null
||
columns
.
isEmpty
())
{
if
(
columns
==
null
||
columns
.
isEmpty
()){
return
null
;
return
null
;
}
}
Reflector
classesReflector
=
reflectorFactory
.
findForClass
(
c
);
Reflector
classesReflector
=
reflectorFactory
.
findForClass
(
c
);
Object
o
=
objectFactory
.
create
(
c
);
Object
o
=
objectFactory
.
create
(
c
);
for
(
String
columnName:
columns
.
keySet
())
{
for
(
String
columnName
:
columns
.
keySet
())
{
String
filedName
=
MapUnderscoreToCamelCase
.
convertByCache
(
columnName
);
String
filedName
=
MapUnderscoreToCamelCase
.
convertByCache
(
columnName
);
Object
value
=
columns
.
get
(
columnName
);
Object
value
=
columns
.
get
(
columnName
);
if
(
value
==
null
)
{
if
(
value
==
null
)
{
continue
;
continue
;
}
}
if
(!
classesReflector
.
hasGetter
(
filedName
))
{
if
(!
classesReflector
.
hasGetter
(
filedName
))
{
continue
;
continue
;
}
}
Type
setterType
=
classesReflector
.
getSetterType
(
filedName
);
Type
setterType
=
classesReflector
.
getSetterType
(
filedName
);
TypeHandler
typeHandler
=
TypeHandlerRegister
.
getTypeHandler
(
setterType
);
try
{
if
(
typeHandler
==
null
){
classesReflector
.
getSetInvoker
(
filedName
).
invoke
(
o
,
new
Object
[]{
Convert
.
convert
(
setterType
,
value
)});
log
.
error
(
"未适配到typeHandle{},name:{},value:{},"
,
setterType
,
filedName
,
value
);
}
catch
(
ConvertException
convertException
)
{
TypeHandler
typeHandler
=
TypeHandlerRegister
.
getTypeHandler
(
setterType
);
if
(
typeHandler
==
null
)
{
log
.
error
(
"未适配到typeHandle{},name:{},value:{},"
,
setterType
,
filedName
,
value
);
}
classesReflector
.
getSetInvoker
(
filedName
).
invoke
(
o
,
new
Object
[]{
typeHandler
.
convert
(
value
)});
}
}
classesReflector
.
getSetInvoker
(
filedName
).
invoke
(
o
,
new
Object
[]{
typeHandler
.
convert
(
value
)});
}
}
return
o
;
return
o
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment