提交 cec3d535 authored 作者: liupengfei's avatar liupengfei

钉钉通知消息

上级 a05e24d0
package com.util;
import com.enums.interfaces.EnumsBindBean;
import com.enums.interfaces.EnumsInterface;
import com.enums.interfaces.LoggerFactory;
import com.enums.interfaces.bean.EnumsBindObject;
import org.slf4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public abstract class BaseSpringContextUtils implements ApplicationContextAware, LoggerFactory {
protected ApplicationContext context;
private Map<Class<?>, Map<Object, List<EnumsBindObject<EnumsInterface<?>>>>> enumsBindMap;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
this.context = context;
Logger log = getLog();
log.debug("加载枚举绑定操作");
this.enumsBindMap = initEnum();
init();
}
public void init(){
// 子类实现覆盖逻辑
}
/**
* 枚举绑定操作初始化
* @return
* @author lpf
* @date: 2019年1月7日 上午10:09:37
*/
private Map<Class<?>, Map<Object, List<EnumsBindObject<EnumsInterface<?>>>>> initEnum(){
Map<String, EnumsBindBean> map = context.getBeansOfType(EnumsBindBean.class);
Map<Class<?>, Map<Object, List<EnumsBindObject<EnumsInterface<?>>>>> result = map.keySet().stream().map(key -> {
EnumsBindBean<EnumsInterface<?>> value = map.get(key);
List<EnumsBindObject<EnumsInterface<?>>> list = value.getEnums().stream().map(v -> {
EnumsBindObject<EnumsInterface<?>> object = new EnumsBindObject<>();
object.setName(key);
object.setEnumObject(v);
object.setBindBean(value);
return object;
}).collect(Collectors.toList());
return list;
})
.flatMap(List::stream)
.collect(Collectors.groupingBy((EnumsBindObject<EnumsInterface<?>> v) -> {
EnumsInterface<?> t = v.getEnumObject();
if (t == null) {
throw new RuntimeException(v.getClass() + "#getEnumObject方法不能返回空");
}
return t.getClass();
},Collectors.groupingBy((EnumsBindObject<EnumsInterface<?>> v) -> {
EnumsInterface<?> t = v.getEnumObject();
return t.getCode();
})
));
return result;
}
public ApplicationContext getContext() {
return this.context;
}
public Map<Class<?>, Map<Object, List<EnumsBindObject<EnumsInterface<?>>>>> getEnumsBindMap() {
return enumsBindMap;
}
public <T,D extends EnumsInterface<T>> Map<Object, List<EnumsBindObject<EnumsInterface<?>>>> getEnumsBindMap(Class<D> enumClass){
Map<Object, List<EnumsBindObject<EnumsInterface<?>>>> map = enumsBindMap.get(enumClass);
return map;
}
/**
* 获取枚举绑定对象
* @param enumClass
* @param code
* @return
* @author lpf
* @date: 2019年1月7日 上午11:03:08
*/
@SuppressWarnings("unchecked")
public <T,D extends EnumsInterface<T>> EnumsBindObject<D> getEnumsBindObject(Class<D> enumClass, T code){
Map<Object, List<EnumsBindObject<EnumsInterface<?>>>> map = enumsBindMap.get(enumClass);
if (map == null) {
getLog().warn("type:"+ enumClass +",code:"+ code +"获取枚举绑定操作失败");
return null;
}
List<EnumsBindObject<EnumsInterface<?>>> list = map.get(code);
if (ArrayUtils.empty(list)) {
getLog().warn("type:"+ enumClass +",code:"+ code +",获取枚举绑定操作失败");
return null;
}
// WARN EnumsBindObject 同一种枚举不同的绑定接口 获取接口时会有问题
return (EnumsBindObject<D>) list.get(0);
}
/**
* 获取枚举绑定的操作接口
* @param enumClass
* @param code
* @return
* @author lpf
* @date: 2019年1月7日 上午11:08:44
*/
public <T,D extends EnumsInterface<T>> EnumsBindBean<D> getEnumsBindBean(Class<D> enumClass, T code){
EnumsBindObject<D> object = getEnumsBindObject(enumClass, code);
if (object == null) {
throw new RuntimeException("type:"+ enumClass +",code:"+ code +",获取枚举绑定操作失败");
}
return object.getBindBean();
}
/**
* 获取枚举绑定的操作接口并强转为target 接口
* @param enumClass
* @param code
* @param target
* @return
* @author lpf
* @date: 2019年1月7日 上午11:29:40
*/
public <T,D extends EnumsInterface<T>,B> B getEnumsBindBean(Class<D> enumClass, T code, Class<B> target) {
try {
@SuppressWarnings("unchecked")
B b = (B) getEnumsBindBean(enumClass, code);
return b;
} catch (Exception e) {
throw new RuntimeException("type:"+ enumClass +",code:"+ code +",得到对象EnumsBindBean<D>" + getEnumsBindBean(enumClass, code).getClass() +" 强转 Class<B>:" + target + "失败");
}
}
}
package com.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class SpringContextUtils extends BaseSpringContextUtils{
private static final Logger logger = LoggerFactory.getLogger(com.util.SpringContextUtils.class);
@Override
public Logger getLog() {
return logger;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论