版权声明:第一次写文章,有什么需要补充的还望各位大神多多指教。 https://blog.csdn.net/mengxiangxingdong/article/details/82691540
之前搭配spring 的版本 https://blog.csdn.net/mengxiangxingdong/article/details/82683522
代码
1.初始化webservice
package com.ld.admin.listener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jws.WebService;
import javax.servlet.ServletContext;
import javax.xml.ws.Endpoint;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ServletContextAware;
import com.ld.action.index.DaoController;
import com.ld.model.ConfigModel;
import com.ld.util.ClassUtil;
import lombok.extern.slf4j.Slf4j;
/**
* 初始化注册所有的webService
*
* @ClassName InitWebService
* @author <a href="[email protected]" target="_blank">于国帅</a>
* @date 2018年9月12日 下午4:43:58
*
*/
@Component
@Slf4j
public class InitWebService implements InitializingBean, ServletContextAware {
private static final String WEB_SERVICE_PACKAGE = "com.ld.webservice";// 默认webservice扫描的类
private static final String WEB_SERVICE_URL = "/webService/";// 默认webservice扫描的类
private static final Map<String, Object> webServiceMap = new HashMap<>(); // webService url 路由
@Override
public void setServletContext(ServletContext servletContext) {
try {
initWebService(servletContext);
} catch (Exception e) {
log.error("初始化webService 异常 请检查");
}
}
@Override
public void afterPropertiesSet() throws Exception {
// Auto-generated method stub
}
public static void main(String[] args) {
// initWebService(null);
}
private static void initWebService(ServletContext context) {
// 获取日志是否打印
boolean logFlag = ConfigModel.CONFIG.getPropertyBooleanValue("log4j.out.webservice", false);
// 获取域名配置
String webServiceDomain = ConfigModel.CONFIG.getProperty("webServiceDomain");
// 先扫描到所有的类
if (WEB_SERVICE_PACKAGE != null && WEB_SERVICE_PACKAGE.length() > 0) {
String[] WEB_SERVICE_PACKAGEArrs = WEB_SERVICE_PACKAGE.split(",");
for (int i = 0; i < WEB_SERVICE_PACKAGEArrs.length; i++) {
String packageName = WEB_SERVICE_PACKAGEArrs[i];
List<Class<? extends DaoController>> actionClassList = ClassUtil.getClassList(packageName, DaoController.class, true); // 加载jar包中的action(需测试不同项目的兼容性)
for (Class<? extends DaoController> actionClass : actionClassList) {
WebService webService = actionClass.getAnnotation(WebService.class);
if (webService != null) {
String beanName = actionClass.getSimpleName(); // 后期可以首字母小写
// 注册
String domainUrl = webServiceDomain + WEB_SERVICE_URL + beanName;
// 通过反射 实例化对象
try {
Endpoint.publish(domainUrl, actionClass.newInstance());
} catch (Exception e) {
log.error("类 反射实例化失败" + actionClass.getName());
}
if (webServiceMap.containsKey(domainUrl)) {
log.error("webService路由存在重复url 暂不注册 url=" + domainUrl + "?wsdl");
} else {
webServiceMap.put(domainUrl, actionClass);
if (logFlag) {
log.error("webService注册路径====" + domainUrl + "?wsdl");
}
}
}
}
}
}
}
}
2.ClassUtil
```java
package com.ld.util;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import lombok.extern.slf4j.Slf4j;
/**
*
* 数据转换操作相关
*
* @ClassName ClassUtil
* @author <a href="mailto:[email protected]" target="_blank">kevin</a>
* @date 2016年8月25日 下午2:59:02
*
*/
@Slf4j
public class ClassUtil {
private final static String ROOT_PATH = PathUtil.getProjectAbsolutePath();
/**
*
* 获取某个包下面的所有类名
*
* @Title getClassList
* @param pckgname
* @param superClass
* @return List<Class<? extends T>>
*/
@SuppressWarnings("unchecked")
public final static <T> List<Class<? extends T>> getClassList(String pckgname, Class<T> superClass) {
List<Class<? extends T>> classes = new ArrayList<Class<? extends T>>();
File directory = new File(ROOT_PATH + pckgname.replace('.', '/'));
if (directory.exists()) {
File[] files = directory.listFiles();
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getName();
if (fileName.endsWith(".class")) {
try {
Class<?> cl = Class.forName(pckgname + '.' + fileName.replace(".class", ""));
if (superClass.isAssignableFrom(cl)) {
classes.add((Class<T>) cl);
}
} catch (ClassNotFoundException e) {
log.error("", e);
}
} else if (files[i].isDirectory()) {
classes.addAll(getClassList(pckgname + "." + fileName, superClass));
}
}
}
return classes;
}
public static void main(String[] args) {
// 标识是否要遍历该包路径下子包的类名
// boolean recursive = false;
boolean recursive = true;
// 指定的包名
// String pkg = "javax.crypto.spec";// 为java/jre6/lib/jce.jar,普通的java工程默认已引用
// String pkg = "com.ld";
String pkg = "com.ld";
List<?> list = null;
// list = getClassList(pkg, recursive, null);
// 增加 author.class的过滤项,即可只选出ClassTestDemo
list = getClassList(pkg, Object.class, recursive);
for (int i = 0; i < list.size(); i++) {
System.out.println(i + ":" + list.get(i));
}
System.exit(0);
}
/**
* 获取某个包下面的所有父类为superClass的类名(jar包下的也会获取)
*
* @Title getClassList
* @author 吕凯
* @date 2016年10月10日 下午5:02:43
* @param pkgName
* 包名
* @param superClass
* 父类
* @param isRecursive
* 是否查询下级子目录
* @return List<Class<?>>
*/
public static <T> List<Class<? extends T>> getClassList(String pkgName, Class<T> superClass, boolean isRecursive) {
List<Class<? extends T>> classList = new ArrayList<Class<? extends T>>();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try {
// 按文件的形式去查找
String strFile = pkgName.replaceAll("\\.", "/");
Enumeration<URL> urls = loader.getResources(strFile);
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
if (url != null) {
String protocol = url.getProtocol();
String pkgPath = url.getPath();
log.warn("protocol:" + protocol + " path:" + pkgPath + " 父类:" + superClass.getName());
if ("file".equals(protocol)) {
// 本地自己可见的代码
findClassName(classList, pkgName, pkgPath, isRecursive, superClass);
} else if ("jar".equals(protocol)) {
// 引用第三方jar的代码
findClassName(classList, pkgName, url, isRecursive, superClass);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classList;
}
/**
* 本地文件
*
* @Title findClassName
* @author 吕凯
* @date 2016年10月11日 上午8:43:48
* @param clazzList
* @param pkgName
* @param pkgPath
* @param isRecursive
* @param superClass
* void
*/
public static <T> void findClassName(List<Class<? extends T>> clazzList, String pkgName, String pkgPath, boolean isRecursive,
Class<T> superClass) {
if (clazzList == null) {
return;
}
File[] files = filterClassFiles(pkgPath);// 过滤出.class文件及文件夹
if (files != null) {
for (File f : files) {
String fileName = f.getName();
if (f.isFile()) {
// .class 文件的情况
String clazzName = getClassName(pkgName, fileName);
addClassName(clazzList, clazzName, superClass);
} else {
// 文件夹的情况
if (isRecursive) {
// 需要继续查找该文件夹/包名下的类
String subPkgName = pkgName + "." + fileName;
String subPkgPath = pkgPath + "/" + fileName;
findClassName(clazzList, subPkgName, subPkgPath, true, superClass);
}
}
}
}
}
/**
* 第三方Jar类库的引用。<br/>
*
* @throws IOException
*/
public static <T> void findClassName(List<Class<? extends T>> clazzList, String pkgName, URL url, boolean isRecursive,
Class<T> superClass) throws IOException {
JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();
JarFile jarFile = jarURLConnection.getJarFile();
log.warn("获取jar包中" + superClass.getName() + "的子类:" + pkgName + " jarFile:" + jarFile.getName());
Enumeration<JarEntry> jarEntries = jarFile.entries();
while (jarEntries.hasMoreElements()) {
JarEntry jarEntry = jarEntries.nextElement();
String jarEntryName = jarEntry.getName(); // 类似:sun/security/internal/interfaces/TlsMasterSecret.class
String clazzName = jarEntryName.replace("/", ".");
int endIndex = clazzName.lastIndexOf(".");
String prefix = null;
if (endIndex > 0) {
String prefix_name = clazzName.substring(0, endIndex);
endIndex = prefix_name.lastIndexOf(".");
if (endIndex > 0) {
prefix = prefix_name.substring(0, endIndex);
}
}
if (prefix != null && jarEntryName.endsWith(".class")) {
if (prefix.equals(pkgName)) {
log.info("jar entryName:" + jarEntryName);
addClassName(clazzList, clazzName, superClass);
} else if (isRecursive && prefix.startsWith(pkgName)) {
// 遍历子包名:子类
log.info("jar entryName:" + jarEntryName + " isRecursive:" + isRecursive);
addClassName(clazzList, clazzName, superClass);
}
}
}
}
private static File[] filterClassFiles(String pkgPath) {
if (pkgPath == null) {
return null;
}
// 接收 .class 文件 或 类文件夹
return new File(pkgPath).listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory();
}
});
}
private static String getClassName(String pkgName, String fileName) {
int endIndex = fileName.lastIndexOf(".");
String clazz = null;
if (endIndex >= 0) {
clazz = fileName.substring(0, endIndex);
}
String clazzName = null;
if (clazz != null) {
clazzName = pkgName + "." + clazz;
}
return clazzName;
}
@SuppressWarnings("unchecked")
private static <T> void addClassName(List<Class<? extends T>> clazzList, String clazzName, Class<T> superClass) {
if (clazzList != null && clazzName != null) {
clazzName = clazzName.replace(".class", "");
Class<?> clazz = null;
try {
clazz = Class.forName(clazzName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 不包含父类
if (clazz != null && superClass.isAssignableFrom(clazz) && !superClass.equals(clazz)) {
clazzList.add((Class<T>) clazz);
}
}
}
/**
*
* Object转换成Int类型
*
* @Title obj2int
* @param obj
* Object
* @return int
*/
public static int obj2int(Object obj) {
if (obj != null) {
try {
return Integer.parseInt(obj.toString());
} catch (NumberFormatException e) {
}
}
return 0;
}
/**
*
* Object转换成Long类型
*
* @Title obj2long
* @param obj
* Object
* @return long
*/
public static long obj2long(Object obj) {
if (obj != null) {
try {
return Long.parseLong(obj.toString());
} catch (NumberFormatException e) {
}
}
return 0;
}
/**
*
* Object转换成Double类型
*
* @Title obj2doulbe
* @param obj
* Object
* @return double
*/
public static double obj2doulbe(Object obj) {
if (obj != null) {
try {
return Double.parseDouble(obj.toString());
} catch (NumberFormatException e) {
}
}
return 0;
}
@SuppressWarnings("unchecked")
public static <T> T obj2T(Object obj, Class<T> type) {
if (obj == null) {
return null;
}
Object model = null;
if (type.equals(Integer.class) || type.equals(int.class)) {
model = (obj.equals("")) ? null : new Integer(obj.toString());
} else if (type.equals(Long.class) || type.equals(long.class)) {
model = (obj.equals("")) ? null : new Long(obj.toString());
} else if (type.equals(Float.class) || type.equals(float.class)) {
model = (obj.equals("")) ? null : new Float(obj.toString());
} else if (type.equals(Double.class) || type.equals(double.class)) {
model = (obj.equals("")) ? null : new Double(obj.toString());
} else if (type.equals(String.class)) {
model = (obj == null) ? null : obj.toString();
} else {
model = obj;
}
return (T) model;
}
/**
*
* Date转换成int
*
* @Title date2int
* @param dateStr
* date字符串
* @return int
*/
public static int date2int(String dateStr) {
int dateInt;
try {
dateInt = Integer.parseInt(dateStr.replace("-", ""));
} catch (Exception e) {
log.warn("日期转换出错:'" + dateStr + "'");
dateInt = 0;
}
return dateInt;
}
/**
*
* Date转换成Long
*
* @Title date2long
* @param dateStr
* date字符串
* @return long
*/
public static long date2long(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(dateStr);
return date.getTime();
} catch (ParseException e) {
log.warn("日期转换出错:'" + dateStr + "'");
return 0;
}
}
}