Dorado项目使用JRebel时,DataProvider及DataResolver标签标注的方法不会自动注册到DefaultDefinitionManager中,做了一个工具类,在Client设置一个按钮即可更新注册。如果有时间可以将这个功能映射到URL,这样使用会更加方便。
public class DataObjectAnnotationUtils {
private static final Log logger = LogFactory.getLog(DataObjectAnnotationUtils.class);
private static final String DEFAULT_DATA_PROVIDER = "com.bstek.dorado.data.provider.DirectDataProvider";
private static final String DEFAULT_DATA_RESOLVER = "com.bstek.dorado.data.resolver.DirectDataResolver";
private static final Scope DEFAULT_DATA_PROVIDER_SCOPE = null;
private static final Scope DEFAULT_DATA_RESOLVER_SCOPE = null;
private static final String BEAN_NAME_PREFIX = "spring:";
public final static void reregiste() throws Exception {
DataProviderDefinitionManager dataProviderDefinitionManager =
(DataProviderDefinitionManager)DoradoContext.getCurrent().getServiceBean("dataProviderDefinitionManager");
DataResolverDefinitionManager dataResolverDefinitionManager =
(DataResolverDefinitionManager)DoradoContext.getCurrent().getServiceBean("dataResolverDefinitionManager");
dataProviderDefinitionManager.clearAllDefinitions();
logger.info("Clear all data provider definetions");
dataResolverDefinitionManager.clearAllDefinitions();
logger.info("Clear all data resolver definetions");
String[] beanNames = SpringContextUtils.getApplicationContext().getBeanDefinitionNames();
for (String beanName : beanNames) {
Class<?> beanType = SpringContextUtils.getType(beanName);
if (beanType != null && beanType.getMethods() != null) {
beanType = beanType.getSuperclass();
for (Method method : beanType.getMethods()) {
DataProvider dataProviderAnnotation = method.getAnnotation(DataProvider.class);
if (dataProviderAnnotation != null) {
autoRegisterDataObject(dataProviderAnnotation,
beanName, method.getName(), DataObjectType.dataProvider,
dataProviderDefinitionManager, dataResolverDefinitionManager);
}
DataResolver dataResolverAnnotation = method.getAnnotation(DataResolver.class);
if (dataResolverAnnotation != null) {
autoRegisterDataObject(dataResolverAnnotation,
beanName, method.getName(), DataObjectType.dataResolver,
dataProviderDefinitionManager, dataResolverDefinitionManager);
}
}
}
}
}
private static void autoRegisterDataObject(Annotation annotation, String beanName,
String methodName, DataObjectType type,
DataProviderDefinitionManager dataProviderDefinitionManager,
DataResolverDefinitionManager dataResolverDefinitionManager) throws Exception {
String dataObjectName = null;
if (DataObjectType.dataProvider.equals(type)) {
DataProvider dataProvider = (DataProvider) annotation;
if (StringUtils.isNotEmpty(dataProvider.name())) {
dataObjectName = dataProvider.name();
} else {
dataObjectName = beanName + "#" + methodName;
}
DataProviderDefinition definition = dataProviderDefinitionManager.getDefinition(dataObjectName);
if (definition == null) {
definition = new DataProviderDefinition();
definition.setName(dataObjectName);
definition.setScope(DEFAULT_DATA_PROVIDER_SCOPE);
definition.setImpl(DEFAULT_DATA_PROVIDER);
definition.setInterceptor(BEAN_NAME_PREFIX + dataObjectName);
dataProviderDefinitionManager.registerDefinition(dataObjectName, definition);
logger.info("Reregistered data provider definetion(via Annotation): " + dataObjectName);
}
} else if (DataObjectType.dataResolver.equals(type)) {
DataResolver dataResolver = (DataResolver) annotation;
if (StringUtils.isNotEmpty(dataResolver.name())) {
dataObjectName = dataResolver.name();
} else {
dataObjectName = beanName + "#" + methodName;
}
DataResolverDefinition definition = dataResolverDefinitionManager.getDefinition(dataObjectName);
if (definition == null) {
definition = new DataResolverDefinition();
definition.setName(dataObjectName);
definition.setScope(DEFAULT_DATA_RESOLVER_SCOPE);
definition.setImpl(DEFAULT_DATA_RESOLVER);
definition.setInterceptor(BEAN_NAME_PREFIX + dataObjectName);
dataResolverDefinitionManager.registerDefinition(dataObjectName, definition);
logger.info("Reregistered data resolver definetion(via Annotation): " + dataObjectName);
}
}
}
enum DataObjectType {
dataType, dataProvider, dataResolver
}
}