我使用 spring项目的现有Java域类进行grails项目,我需要配置 typeDefinitions 。在spring项目中,可以配置 LocalSessionFactoryBean 的此属性 - 但是如何在grails项目中执行此操作?
答案 0 :(得分:2)
LocalSessionFactoryBean的Grails版本是一个子类org.codehaus.groovy.grails.orm.hibernate.ConfigurableLocalSessionFactoryBean。它在org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport中注册为Spring bean
sessionFactory(ConfigurableLocalSessionFactoryBean) {
...
}
所以你有几个选择。一种是在resources.groovy中重新定义bean,保持Grails的配置加上你的更改,即
sessionFactory(MyCustomConfigurableLocalSessionFactoryBean) {
...
typeDefinitions = ...
}
或者如果可能的话,你可以引用bean并在BootStrap中修改它:
class BootStrap {
def sessionFactory
def init = { servletContext ->
sessionFactory.foo = bar
}
def destroy = {}
}
看起来typeDefinitions需要提前配置,而工厂bean正在构建SessionFactory,所以选项1可能是你最好的选择。
答案 1 :(得分:1)
另一个选择是使用spring的生命周期回调,例如实现BeanPostProcessor
public class CustomBeanPostProcessor implements BeanPostProcessor {
// simply return the instantiated bean as-is
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean; // we could potentially return any object reference here...
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("sessionFactory".equals(beanName) && bean instanceof ConfigurableLocalSessionFactoryBean) {
ConfigurableLocalSessionFactoryBean sessionFactory = (ConfigurableLocalSessionFactoryBean) bean;
sessionFactory.setTypeDefinitions(...);
}
return bean;
}
}
并将其扔到您的resources.groovy
customProcessor(CustomBeanPostProcessor)
这样您就不必重新定义已连接到GORM动态查找器et.al的sessionFactory bean。