Dorado项目使用JRebel时,DataProvider及DataResolver重新注册的方法

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
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值