【发布时间】:2016-03-30 23:23:07
【问题描述】:
我正在创建一个包含 CustomService 的新插件,该插件旨在从现有插件中替换现有服务。按照在自定义安全实现中找到并显示为here 的模式,我已将配置添加到 resources.groovy、oldService(path.to.new.CustomService)。我还尝试将所有注入的类添加到该服务的闭包中。 (实际的服务名称是代码块中的 RegistrationPersonRegistrationCompositeService 和 NewRegistrationPersonRegistrationCompositeService)
我不希望原始应用程序代码对新插件有任何引用。但是,应用程序级别的 BuildConfig 将需要 plugin.location 条目。我的 resource.groovy 模组在新插件中。我在这方面的努力没有成功。我是否修改了错误的 resources.groovy?如果需要在原始应用程序代码中进行此更改,我将无法保持原始代码不变。我没有扩展原始服务,也没有使用覆盖注释。我的意图是在启动时替换服务(Spring bean)。新插件依赖于旧插件,试图管理加载这些类的操作顺序。
旧服务之前注入控制器是否重要?这将需要我以相同的方式覆盖新插件中的控制器并为所需的行为注入正确的服务?
我发现文档显示在插件中,resources.groovy 将被忽略。此外,将 resources.groovy 构建成战争也是有问题的。我还没有找到解决方案。我没有得到任何可以分享的错误,只是缺少所需的行为;原始服务正在处理请求。
//was resource.groovy - now renamed to serviceOverRide.groovy - still located in \grails-app\conf\spring of plugin
//tried this with and without the BeanBuilder. Theory: I'm missing the autowire somehow
import org.springframework.context.ApplicationContext
import grails.spring.BeanBuilder
def bb = new BeanBuilder()
bb.beans {
registrationPersonRegistrationCompositeService(path.to.services.registration.NewRegistrationPersonRegistrationCompositeService) { bean ->
bean.autowire = true
registrationRestrictionCompositeService = ref("registrationRestrictionCompositeService")
registrationPersonTermVerificationService = ref("registrationPersonTermVerificationService")
}
classRegistrationController(path.to.services.registration.ClassRegistrationController) { bean ->
bean.autowire = true
selfServiceLookupService = ref("selfServiceLookupService")
registrationPersonRegistrationCompositeService = ref("registrationPersonRegistrationCompositeService")
}
}
ApplicationContext appContext = bb.createApplicationContext()
附加信息:在 PluginGrailsPlugin.groovy 中添加了以下行。原始服务仍在处理这些请求
def dependsOn = ['appPersonRegistration': '1.0.20 > *']
List loadAfter = ['appPersonRegistration']
def doWithSpring = {
registrationPersonCourseRegistrationCompositeService(path.to.new.registration.TccRegistrationPersonCourseRegistrationCompositeService)
}
def doWithApplicationContext = { applicationContext ->
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory()
beanFactory.registerBeanDefinition("registrationPersonCourseRegistrationCompositeService", BeanDefinitionBuilder.rootBeanDefinition(TccRegistrationPersonCourseRegistrationCompositeService.class.getName()).getBeanDefinition())
}
【问题讨论】:
标签: spring grails dependency-injection