当前位置:网站首页 / Java代码 / 正文

使用Spring AOP完成人性化日志(注解版本)

时间:2015年09月29日 | 作者 : admin | 分类 : Java代码 | 浏览: 850次 | 评论 0

配置版本点我

在配置版本中修改第三步为下面的第一步,删除第四步增加下面的第二步和第三步即可

---第一步---------LogEventListener.groovy----------

package com.fiberhome.sdmp

import java.lang.reflect.Field
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
import org.hibernate.event.DeleteEvent
import org.hibernate.event.SaveOrUpdateEvent
import org.hibernate.event.def.DefaultDeleteEventListener
import org.hibernate.event.def.DefaultSaveOrUpdateEventListener
import com.fiberhome.sdmp.system.SystemLog

class LogEventListener extends DefaultSaveOrUpdateEventListener {
	private static final Log log = LogFactory.getLog(this)
	@Override
	public void onSaveOrUpdate(SaveOrUpdateEvent event) {
		log.debug'onSaveOrUpdate.............'
		//--------------save audited start
		def isUpdate
		def entity = event.entity

		if(entity && entity.hasProperty("audited")) {

			if(entity.audited){
				log.debug 'audited.update().............'
				isUpdate=true
				entity.audited.update()
			}else{
				log.debug 'new Audited().............'
				isUpdate=false
				entity.audited = new Audited()
				entity.audited.create()
			}
		}
		//--------------save audited end
		
		
		//--------------save systemlog start
		SystemLogClass slc = (SystemLogClass)entity.class.getAnnotation(SystemLogClass);
		if(slc){
			//该类增加了注解
			Field[] fields = entity.class.getDeclaredFields();
			
			def tableHead = new StringBuilder("<th></th>")
			def tableFirstRow =new StringBuilder()
			if(isUpdate){
				tableFirstRow.append("<td>更新前</td>")
			}else{
				tableFirstRow.append("<td>新增后</td>")
			}
			def tableSecondRow = new StringBuilder("<td>更新后</td>")
			
			for(Field field:fields){
				SystemLogFieldName slfn = (SystemLogFieldName)field.getAnnotation(SystemLogFieldName);
				if(slfn){
					//该字段增加了注解
					tableHead.append("<th>${slfn.value()?slfn.value():field.getName()}</th>")
					tableFirstRow.append("<td>${entity?.getPersistentValue(field.getName())?:''}</td>")
					if(isUpdate){
						tableSecondRow.append("<td>${entity?.getAt(field.getName())?:''}</td>")
					}
				}
			}
			def secondRow = ""
			if(isUpdate){
				secondRow = "<tr>${tableSecondRow}</tr>"
			}

			def content = "<table><tr>${tableHead}</tr><tr>${tableFirstRow}</tr>${secondRow}</table>"
			def parentTable=""
			def parentRow=""
			if(slc.pTableName()&&slc.pFieldName()){
				parentTable=slc.pTableName()
				parentRow=entity.getAt(slc.pFieldName())?.id
			}
			
			def param=["cuttentTable":slc.tableName(),
						"currentRow":entity.id,
						"operation":isUpdate?'更新':'新增',
						"content":content,
						"parentTable":parentTable,
						"parentRow":parentRow]

			SystemLog sl=new SystemLog(param)
			sl.save()
		}
		//--------------save systemlog end

		super.onSaveOrUpdate(event);
	}
}

class LogDeleteEventListener extends DefaultDeleteEventListener {
	@Override
	public void onDelete(DeleteEvent event) {
		def entity=event.object
		log.debug'onDelete.............'
		SystemLogClass slc = (SystemLogClass)entity.class.getAnnotation(SystemLogClass);
		if(slc){
			//该类增加了注解
			Field[] fields = entity.class.getDeclaredFields();
			
			def tableHead = new StringBuilder("<th></th>")
			def tableFirstRow =new StringBuilder("<td>删除前</td>")
			
			for(Field field:fields){
				SystemLogFieldName slfn = (SystemLogFieldName)field.getAnnotation(SystemLogFieldName);
				if(slfn){
					//该字段增加了注解
					tableHead.append("<th>${slfn.value()?slfn.value():field.getName()}</th>")
					tableFirstRow.append("<td>${entity?.getPersistentValue(field.getName())?:''}</td>")
				}
			}
			def content = "<table><tr>${tableHead}</tr><tr>${tableFirstRow}</tr></table>"
			def parentTable=""
			def parentRow=""
			if(slc.pTableName()&&slc.pFieldName()){
				parentTable=slc.pTableName()
				parentRow=entity.getAt(slc.pFieldName())?.id
			}
			def param=["cuttentTable":slc.tableName(),
						"currentRow":entity.id,
						"operation":"删除",
						"content":content,
						"parentTable":parentTable,
						"parentRow":parentRow]

			SystemLog sl=new SystemLog(param)
			sl.save()
		}
		super.onDelete(event);
	}
}

---第二步---------SystemLogFieldName.groovy----------

package com.fiberhome.sdmp

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SystemLogFieldName {
	String value() default "";
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface SystemLogClass {
	String pFieldName() default ""//父类值
	String tableName() default ""//当前表名
	String pTableName() default ""//父类表名
	
}

---第三步---------给类增加注解----------

package com.fiberhome.sdmp.ne

import com.fiberhome.sdmp.Audited;
import com.fiberhome.sdmp.SystemLogClass
import com.fiberhome.sdmp.SystemLogFieldName

/**
* @author pros_fs
* @version 网元
* */
@SystemLogClass(tableName="devi_net_element",pTableName="devi_device",pFieldName="deviDevice")
class DeviNeElement {
	//统一网元类型编号
	@SystemLogFieldName("网元统一编号")
	Integer uniNo
	//网元编号
	@SystemLogFieldName("网元编号")
	Integer no
	//网元类型名称
	@SystemLogFieldName("网元名称")
	String name
	//网元速率
	@SystemLogFieldName("网元速率")
	Integer nespeed
	//设备类型
	DeviDevice deviDevice
	//FIXME 要删除交叉类型,交叉类型作为设备大类
	//是否有控制面板
	Integer controlPanel
	//网管上备选的逻辑EMU
	Integer emuId
	//协议分类
	String protocolType
	//分组代码
	Integer groupCode
	//英文网元别名
	@SystemLogFieldName("网元英文名")
	String enAlias
	//中文网元别名
	@SystemLogFieldName("网元中文名")
	String cnAlias

	//网元排序
	Float sequence
	
	/**
	 * 只用于接入,是否带框
	 */
    boolean withShelf
   
	/**
	 * 只用于接入,代理用的系统类型 
	 */
    String deviceCode
	//是否有问题(对象下面无框或者无主框)
	boolean iserror
	
	Audited audited
	static embedded =['audited']

	static constraints = {
		audited nullable:true
		uniNo nullable:true
		no nullable:true
		name nullable:true,maxSize:30
		nespeed nullable:true
		emuId nullable:true
		protocolType nullable:true,maxSize:20
		groupCode nullable:true
		enAlias nullable:true,maxSize:30
		cnAlias nullable:true,maxSize:30
		sequence nullable:true
		controlPanel nullable:true
		withShelf nullable:true
		deviceCode nullable:true, maxSize:4
		iserror nullable:true
    }
	static mapping = {
		table 'devi_net_element'
		version false
		cache true
		id generator: 'increment',sqlType:"bigint"
	}
}


猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

网站分类