Service业务接口类:
package com.han.service;
/**
* @author hanwei
* @date:2016-8-24 上午10:05:03
*/
public interface InitService extends GenericServ {
/**
* 通过xml初始化数据
* @param fileName
*/
public void addInitEntityByXml(String fileName);
}
Service业务接口实现类:
package com.han.service.impl;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import javax.inject.Inject;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.stereotype.Service;
import com.han.dao.impl.GenericDaoImpl;
import com.han.error.GlobalException;
import com.han.service.InitService;
import com.sun.org.apache.commons.beanutils.BeanUtils;
/**
* @author hanwei
* @date:2016-8-24 上午10:05:31
*/
@Service("initService")
public class InitServiceImpl extends GenericDaoImpl implements InitService {
// 注入Spring工厂用于加载实体类
@Inject
private BeanFactory beanFactory;
/**
* 获得初始化xml文件数据对象Document
* @param fileName 文件名称
* @return
*/
private Document readDocument(String fileName) {
Document document = null;
SAXReader saxReader = null;
try {
// 创建xml解析对象
saxReader = new SAXReader();
// 获取文件路劲 该init.xml文件放在WebRoot/init/init.xml
String filePath = InitServiceImpl.class.getClassLoader().getResource("").toString().replace("WEB-INF/classes/", "");
document = saxReader.read(filePath + "init/init.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 解析XMl文件进行数据的添加处理
* @param fileName 文件名称
*/
@Override
public void addInitEntityByXml(String fileName) {
Document readDocument = this.readDocument(fileName);
Element root = null;
try {
if (readDocument != null) {
// 获取根元素
root = readDocument.getRootElement();
// 获取包名
String pname = root.attributeValue("package");
// 根据当前元素节点进行寻找
@SuppressWarnings("unchecked")
List<Element> initEntitys = (List<Element>) root.selectNodes("/entitys/initEntity");
for (Element e : initEntitys) {
// 判断该实体是否存在 0:不存在进行添加 1:存在排除
if (e.attributeValue("exist") == "1") {
continue;
} else {
// 获取类名
String cname = e.attributeValue("class");
cname = pname + "." + cname;
// 获取方法
String method = e.attributeValue("method");
// 获取所有的添加的实体
@SuppressWarnings("unchecked")
List<Element> entitys = (List<Element>) e.selectNodes("entity");
addElements(cname, method, entitys);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 解析出每个元素节点的数据进行添加
* @param cname 包名.类名 com.han.model.OrgType
* @param method 方法名 <initEntity exist="0" class="OrgType" method="orgTypeService.addOrgType">
* @param entitys 添加的元素集合 <entity name="学校" sn="XX"></entity>
*/
private void addElements(String cname, String method, List<Element> entitys) {
for (Element e : entitys) {
addElement(cname, method, e);
}
}
/**
* 添加元素
* @param cname 包名.类名
* @param method 方法名
* @param e 添加的元素
*/
private void addElement(String cname, String method, Element e) {
Object obj = null;
Object service = null;
Method m = null;
try {
// 通过反射创建对象
obj = Class.forName(cname).newInstance();
// 拆分method="orgTypeService.addOrgType"获取业务service类名和方法
String[] ms = method.split("\\.");
if (ms.length != 2) {
throw new GlobalException("方法格式不正确!");
}
String sname = ms[0];
String mname = ms[1];
@SuppressWarnings("unchecked")
List<Attribute> attributes = (List<Attribute>) e.attributes();
for (Attribute attribute : attributes) {
// 元素属性名称
String name = attribute.getName();
// 元素属性值
String value = attribute.getValue();
try {
// 导入的是com.sun.org.apache.commons.beanutils.BeanUtils,进行对象属性的赋值操作
// 第一个参数:对象,第二个参数:属性,第三个参数:值
BeanUtils.copyProperty(obj, name, value);
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
}
// 通过Spring工厂获取业务逻辑类service
service = beanFactory.getBean(sname);
// 获取service方法 ,第一个参数:方法名称 ,第二个:参数类型
m = service.getClass().getMethod(mname, obj.getClass());
// 回调方法
m.invoke(service, obj);
} catch (BeansException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (InstantiationException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
}
}
测试类:
package com.han.test;
import javax.inject.Inject;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.orm.hibernate4.SessionHolder;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import com.han.service.InitService;
/**
* @author hanwei
* @date:2016-8-24 上午10:53:49
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/beans.xml")
public class CURDTest {
@Inject
private InitService initService;
@Inject
private SessionFactory sessionFactory;
@Before
public void setUp() {
// 此时最好不要使用Spring的Transactional来管理,因为dbunit是通过jdbc来处理connection,再使用spring在一些编辑操作中会造成事务shisu
Session s = sessionFactory.openSession();
TransactionSynchronizationManager.bindResource(sessionFactory,new SessionHolder(s));
}
@After
public void tearDown() {
SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
Session s = holder.getSession();
s.flush();
TransactionSynchronizationManager.unbindResource(sessionFactory);
}
@Test
public void testXml() {
initService.addInitEntityByXml("init.xml");
}
}
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<entitys package="com.han.model">
<initEntity exist="0" class="OrgType" method="orgTypeService.addOrgType">
<entity name="学校" sn="XX"></entity>
<entity name="分校" sn="FX"></entity>
<entity name="校领导办" sn="XLDB"></entity>
<entity name="行政部门" sn="XZBM"></entity>
<entity name="教学部门" sn="JXBM"></entity>
<entity name="专业" sn="ZY"></entity>
<entity name="班级" sn="BJ"></entity>
</initEntity>
</entitys>