mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 00:58:24 +08:00
fix: #17 全局监听器父类注册是接口时无法触发监听器
This commit is contained in:
parent
f636bb53d1
commit
29cf1945be
@ -16,10 +16,10 @@
|
|||||||
package com.mybatisflex.core;
|
package com.mybatisflex.core;
|
||||||
|
|
||||||
import com.mybatisflex.annotation.InsertListener;
|
import com.mybatisflex.annotation.InsertListener;
|
||||||
|
import com.mybatisflex.annotation.KeyType;
|
||||||
import com.mybatisflex.annotation.SetListener;
|
import com.mybatisflex.annotation.SetListener;
|
||||||
import com.mybatisflex.annotation.UpdateListener;
|
import com.mybatisflex.annotation.UpdateListener;
|
||||||
import com.mybatisflex.core.dialect.DbType;
|
import com.mybatisflex.core.dialect.DbType;
|
||||||
import com.mybatisflex.annotation.KeyType;
|
|
||||||
import org.apache.ibatis.session.Configuration;
|
import org.apache.ibatis.session.Configuration;
|
||||||
import org.apache.ibatis.session.SqlSessionFactory;
|
import org.apache.ibatis.session.SqlSessionFactory;
|
||||||
|
|
||||||
@ -162,11 +162,42 @@ public class FlexGlobalConfig {
|
|||||||
return entityUpdateListeners.get(entityClass);
|
return entityUpdateListeners.get(entityClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取支持该 {@code entityClass} 的update监听器
|
||||||
|
* <p>当registerClass是entityClass的本身或其超类时,则视为支持</p>
|
||||||
|
*
|
||||||
|
* @param entityClass 实体class
|
||||||
|
* @return UpdateListener
|
||||||
|
*/
|
||||||
|
public UpdateListener getSupportedUpdateListener(Class<?> entityClass) {
|
||||||
|
for (Class<?> registerClass : entityUpdateListeners.keySet()) {
|
||||||
|
if (registerClass.isAssignableFrom(entityClass)) {
|
||||||
|
return entityUpdateListeners.get(registerClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public InsertListener getInsertListener(Class<?> entityClass) {
|
public InsertListener getInsertListener(Class<?> entityClass) {
|
||||||
return entityInsertListeners.get(entityClass);
|
return entityInsertListeners.get(entityClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取支持该 {@code entityClass} 的insert监听器
|
||||||
|
* <p>当registerClass是entityClass的本身或其超类时,则视为支持</p>
|
||||||
|
*
|
||||||
|
* @param entityClass 实体class
|
||||||
|
* @return InsertListener
|
||||||
|
*/
|
||||||
|
public InsertListener getSupportedInsertListener(Class<?> entityClass) {
|
||||||
|
for (Class<?> registerClass : entityInsertListeners.keySet()) {
|
||||||
|
if (registerClass.isAssignableFrom(entityClass)) {
|
||||||
|
return entityInsertListeners.get(registerClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public Object getNormalValueOfLogicDelete() {
|
public Object getNormalValueOfLogicDelete() {
|
||||||
return normalValueOfLogicDelete;
|
return normalValueOfLogicDelete;
|
||||||
|
|||||||
@ -778,15 +778,7 @@ public class TableInfo {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InsertListener globalInsertListener = FlexGlobalConfig.getDefaultConfig().getSupportedInsertListener(entityClass);
|
||||||
InsertListener globalInsertListener = null;
|
|
||||||
Class<?> registerClass = entityClass;
|
|
||||||
|
|
||||||
while (globalInsertListener == null && registerClass != Object.class && registerClass != null) {
|
|
||||||
globalInsertListener = FlexGlobalConfig.getDefaultConfig().getInsertListener(registerClass);
|
|
||||||
registerClass = registerClass.getSuperclass();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (globalInsertListener != null) {
|
if (globalInsertListener != null) {
|
||||||
globalInsertListener.onInsert(entity);
|
globalInsertListener.onInsert(entity);
|
||||||
}
|
}
|
||||||
@ -799,14 +791,7 @@ public class TableInfo {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateListener globalUpdateListener = null;
|
UpdateListener globalUpdateListener = FlexGlobalConfig.getDefaultConfig().getSupportedUpdateListener(entityClass);
|
||||||
Class<?> registerClass = entityClass;
|
|
||||||
|
|
||||||
while (globalUpdateListener == null && registerClass != Object.class && registerClass != null) {
|
|
||||||
globalUpdateListener = FlexGlobalConfig.getDefaultConfig().getUpdateListener(registerClass);
|
|
||||||
registerClass = registerClass.getSuperclass();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (globalUpdateListener != null) {
|
if (globalUpdateListener != null) {
|
||||||
globalUpdateListener.onUpdate(entity);
|
globalUpdateListener.onUpdate(entity);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -93,6 +93,12 @@
|
|||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>3.22.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@ -10,8 +10,8 @@ import java.util.Date;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Table(value = "tb_account",dataSource = "ds2",onSet = AccountOnSetListener.class)
|
@Table(value = "tb_account", dataSource = "ds2", onSet = AccountOnSetListener.class)
|
||||||
public class Account extends BaseAccount implements Serializable {
|
public class Account extends BaseAccount implements Serializable, AgeAware {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ public class Account extends BaseAccount implements Serializable {
|
|||||||
@NotBlank
|
@NotBlank
|
||||||
private Date birthday;
|
private Date birthday;
|
||||||
|
|
||||||
@Column(typeHandler = Fastjson2TypeHandler.class,isLarge = true)
|
@Column(typeHandler = Fastjson2TypeHandler.class, isLarge = true)
|
||||||
private Map<String, Object> options;
|
private Map<String, Object> options;
|
||||||
|
|
||||||
@Column(isLogicDelete = true)
|
@Column(isLogicDelete = true)
|
||||||
@ -49,10 +49,12 @@ public class Account extends BaseAccount implements Serializable {
|
|||||||
this.userName = userName;
|
this.userName = userName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int getAge() {
|
public int getAge() {
|
||||||
return age;
|
return age;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setAge(int age) {
|
public void setAge(int age) {
|
||||||
this.age = age;
|
this.age = age;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,14 @@
|
|||||||
|
package com.mybatisflex.test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 有年龄的
|
||||||
|
*
|
||||||
|
* @author snow
|
||||||
|
* @since 2023/4/28
|
||||||
|
*/
|
||||||
|
public interface AgeAware {
|
||||||
|
|
||||||
|
void setAge(int age);
|
||||||
|
|
||||||
|
int getAge();
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package com.mybatisflex.test;
|
||||||
|
|
||||||
|
import com.mybatisflex.annotation.InsertListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年龄处理监听器
|
||||||
|
*
|
||||||
|
* @author snow
|
||||||
|
* @since 2023/4/28
|
||||||
|
*/
|
||||||
|
public class AgeHandleListener implements InsertListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onInsert(Object entity) {
|
||||||
|
if (entity instanceof AgeAware) {
|
||||||
|
AgeAware ageAware = (AgeAware) entity;
|
||||||
|
int age = ageAware.getAge();
|
||||||
|
if (age < 0) {
|
||||||
|
ageAware.setAge(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
package com.mybatisflex.test;
|
||||||
|
|
||||||
|
import com.mybatisflex.core.FlexGlobalConfig;
|
||||||
|
import com.mybatisflex.core.MybatisFlexBootstrap;
|
||||||
|
import org.assertj.core.api.WithAssertions;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
|
||||||
|
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听器测试
|
||||||
|
*
|
||||||
|
* @author snow
|
||||||
|
* @since 2023/4/28
|
||||||
|
*/
|
||||||
|
public class ListenerTest implements WithAssertions {
|
||||||
|
|
||||||
|
// 注册父类接口监听器
|
||||||
|
@Test
|
||||||
|
public void onInsertInterface() throws Exception {
|
||||||
|
DataSource dataSource = new EmbeddedDatabaseBuilder()
|
||||||
|
.setType(EmbeddedDatabaseType.H2)
|
||||||
|
.addScript("schema.sql")
|
||||||
|
.build();
|
||||||
|
// 注册全局监听器
|
||||||
|
FlexGlobalConfig defaultConfig = FlexGlobalConfig.getDefaultConfig();
|
||||||
|
defaultConfig.registerInsertListener(new AgeHandleListener(), AgeAware.class);
|
||||||
|
|
||||||
|
MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance()
|
||||||
|
.setDataSource(dataSource)
|
||||||
|
.addMapper(AccountMapper.class)
|
||||||
|
.start();
|
||||||
|
|
||||||
|
AccountMapper accountMapper = bootstrap.getMapper(AccountMapper.class);
|
||||||
|
Account account = new Account();
|
||||||
|
account.setAge(-2);
|
||||||
|
account.setUserName("on insert");
|
||||||
|
account.setBirthday(new Date());
|
||||||
|
accountMapper.insert(account);
|
||||||
|
|
||||||
|
Account one = accountMapper.selectOneById(account.getId());
|
||||||
|
assertThat(one.getAge()).isEqualTo(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user