spring记录系统中修改操作前后的记录

package cn.com.gei.kmp4.core.crudrecord.intercepters; import java.lang.reflect.Method; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.LazyDynaBean; import org.springframework.aop.MethodBeforeAdvice; import cn.com.gei.kmp4.core.crudrecord.annotation.CRUDAnnotationUtil; import cn.com.gei.kmp4.core.crudrecord.entity.RecordResource; import cn.com.gei.kmp4.core.crudrecord.entity.UpdateRecord; import cn.com.gei.kmp4.core.crudrecord.entity.UpdateRecordDetail; import cn.com.gei.kmp4.core.crudrecord.service.IRecordCompareService; import cn.com.gei.kmp4.core.crudrecord.utils.CRUDRecordUtils; import cn.com.gei.kmp4.core.orm.IBaseDao; import cn.com.gei.kmp4.core.security.SecurityUserHolder; /** * * @ClassName: UpdateAdvice * @Description: TODO (记录对象修改记录) * @author gaowenming * @date 2010-9-21 上午09:19:58 * */ public class UpdateAdvice implements MethodBeforeAdvice { private IRecordCompareService recordCompareService; public void before(Method method, Object[] args, Object target) throws Throwable { Object obj = null; IBaseDao baseDao = null; if (args == null || args.length == 0) { return; } try { baseDao = (IBaseDao) target; } catch (Exception e) { // 如果是service中的update方法,直接返回 return; } try { Object tempObj = args[0]; Class c = baseDao.getEntityClass(); // 判断该实体对象是否需要记录update日志 boolean b = recordCompareService.getUpdateRecordAbled(c.getName()); if (!b) { return; } HashMap<String, String> map = CRUDAnnotationUtil .getAnnotationField(c); if (!map.isEmpty()) { LazyDynaBean bean_new = new LazyDynaBean(c.getName()); BeanUtils.copyProperties(bean_new, tempObj); Map new_mapBean = bean_new.getMap(); /** * 过滤没有注解的属性 */ new_mapBean = CRUDRecordUtils.removeNoDescriptionField(map, new_mapBean); // 查询操作前数据库中的记录 String idName = baseDao.getIdName(); Object idValue = baseDao.getIdValue(tempObj); // 清除临时对象 baseDao.evict(tempObj); if (idValue instanceof java.lang.Integer) { obj = baseDao.getById(Integer.parseInt(idValue.toString())); } else { obj = baseDao.getById(idValue.toString()); } LazyDynaBean bean_old = new LazyDynaBean(obj.getClass() .getName()); BeanUtils.copyProperties(bean_old, obj); Map old_mapBean = bean_old.getMap(); old_mapBean = CRUDRecordUtils.removeNoDescriptionField(map, old_mapBean); // 修改明细 List<UpdateRecordDetail> list = CRUDRecordUtils.compareValues( new_mapBean, old_mapBean, map); // 保存修改明细 RecordResource recordResource = recordCompareService .getRecordResource(c.getName()); if (list != null && list.size() != 0) { UpdateRecord record = new UpdateRecord(); record.setBeanId(idValue.toString()); record.setOccurTime(new Date()); record.setOperator(SecurityUserHolder .getCurrentUserFullName()); record.setRecordResource(recordResource); recordCompareService.saveRecord(record, list); } } } catch (Exception e) { e.printStackTrace(); return; } finally { if (obj != null) { baseDao.evict(obj); } } } public IRecordCompareService getRecordCompareService() { return recordCompareService; } public void setRecordCompareService( IRecordCompareService recordCompareService) { this.recordCompareService = recordCompareService; } }

说明,系统中所有的dao都实现了IBaseDao接口

package cn.com.gei.kmp4.core.orm; import java.io.Serializable; import java.util.List; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Order; public interface IBaseDao<T, PK extends Serializable> { /** * 插入一个实体 * * @param entity */ public void insert(final T entity); /** * 更新一个实体 * * @param entity */ public void update(final T entity); /** * 如果实体存上,更新一个实体,如果实体不存在,插入一个实体 * * @param entity */ public void saveOrUpdate(final T entity); /** * 删除某个实体 * * @param entity */ public void delete(final T entity); /** * 实体 * * @param entity */ public void merge(final T entity); /** * 删除特定实体ID的实体 * * @param id */ public void delete(final PK id); /** * 根据ID得到某个实体,采用load方式,如果不存在,会抛出异常 * * @param id * @return */ public T get(final PK id); /** * 根据ID得到某个实体,采用get方式,如果不存在,返回null * * @param id * @return */ public T getById(final PK id); /** * 根据一个实体id列查找实体 * * @param ids * @return */ public List<T> findByIds(List<PK> ids); /** * 根据某个属性找所有的实现,严格相等 * * @param propertyName * @param value * @return */ public List<T> findAllByProperty(final String propertyName, final Object value); /** * 用hql查询 * * @param <X> * @param hql * @param values * @return */ public <X> List<X> findByHql(final String hql, final Object... values); /** * 用hql查询从first开始的max条数据 * * @param <X> * @param first * @param max * @param hql * @param values * @return */ public <X> List<X> findByHql(final int first, final int max, final String hql, final Object... values); /** * 用namedquery查询 * * @param <X> * @param namedQuery * @param values * @return */ public <X> List<X> findAllByNamedQuery(final String namedQuery, final Object... values); /** * 用namedquery查询从first开始的max条数据 * * @param <X> * @param first * @param max * @param namedQuery * @param values * @return */ public <X> List<X> findAllByNamedQuery(final int first, final int max, final String namedQuery, final Object... values); /** * 用hql得到某个实体的数量 * * @param hql * @param values * @return */ public int getCountByHql(final String hql, final Object... values); /** * 用namedQuery查询数量,namedQuery必须写select count(*) * * @param namedQuery * @param values * @return */ public int getCountByNamedQuery(final String namedQuery, final Object... values); /** * 用sql或者hql批量更新,删除 * * @param queryString * @return */ public int batchExecute(final String queryString); /** * 用sql或者hql批量更新,删除,可以带?参数 * * @param queryString * @return */ public int batchExecute(final String queryString, final Object... values); /** * 通过Criterion查询 * * @param criterions * @return */ public List<T> find(final Order[] order, final Criterion... criterions); /** * 通过Criterion分页查询 * * @param first * @param max * @param order * @param criterions * @return */ public List<T> find(final int first, final int max, final Order[] order, final Criterion... criterions); /** * 某个实体的主键值 * * @param entity * @return */ public Object getIdValue(final T entity); /** * 得到实体的class * * @return */ public Class<T> getEntityClass(); /** * 得到某个类主键 * * @return */ public String getIdName(); /** * * @Title: evict * @Description: TODO (把指定对象从缓存中清空) * @param @param entity * @return void * @throws */ public void evict(final T entity); /** * * @Title: clear * @Description: TODO (清除缓存内的对象) * @param * @return void * @throws */ public void clear(); }

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>*DAO</value> <value>*Dao</value> <value>*Service</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> <value>deleteAttachmentInterceptor</value> <value>recordLogAdvisor</value> </list> </property> </bean> <!-- 对象修改记录拦截器 --> <bean id="updateAdvice" class="cn.com.gei.kmp4.core.crudrecord.intercepters.UpdateAdvice"> <property name="recordCompareService" ref="recordCompareService"></property> </bean> <bean id="recordLogAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice" ref="updateAdvice" /> <property name="patterns"> <list> <!-- 需要拦截的方法 --> <value>.*update.*</value> <value>.*saveOrUpdate.*</value> </list> </property> </bean>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值