2010-01-21 56 views
0

我必須用我的現有的Java域類一春天項目 Grails項目,我需要配置類型定義。在spring項目中,可以配置LocalSessionFactoryBean的這個屬性 - 但是如何在grails項目中做到這一點?配置性能

回答

2

LocalSessionFactoryBean的Grails版本是org.codehaus.groovy.grails.orm.hibernate.ConfigurableLocalSessionFactoryBean的子類。它註冊爲org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport一個Spring bean作爲

sessionFactory(ConfigurableLocalSessionFactoryBean) { 
    ... 
} 

讓你有幾個選項。一個是在resources.groovy重新定義豆,保持什麼Grails的配置再加上你的變化,即

sessionFactory(MyCustomConfigurableLocalSessionFactoryBean) { 
    ... 
    typeDefinitions = ... 
} 

或者如果可能的話,你可以參考豆和修改自舉:

class BootStrap { 

    def sessionFactory 

    def init = { servletContext -> 
     sessionFactory.foo = bar 
    } 

    def destroy = {} 
} 

它看起來像typeDefinitions需要儘早配置,而工廠bean正在構建SessionFactory,所以選項1可能是您最好的選擇。

+0

這似乎是正確的方式來實現我想要的,但我不得不承認,我的Grails知識不如我的春天的知識 - 所以你可以給我一個關於如何「重新定義資源bean」的小費。常規,維護Grails配置加上您的更改「? – 2010-01-21 09:07:19

1

另一種選擇是使用彈簧的生命週期回調,例如,實現了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動態查找器等SessionFactory的bean的多數民衆贊成.al。

+0

不錯的建議,問題是postProcessAfterInitialization永遠不會調用名爲sessionFactory的bean或ConfigurableLocalSessionFactoryBean的實例: - ( – 2010-01-21 11:57:54

+0

是否將bean定義添加到您的resources.groovy?我測試了上面的代碼並設置了TypeDefinitions的工作 – 2010-01-21 12:05:58

+0

我發現爲什麼這不適用於我的情況:sessionFactory無法實例化,因爲它加載映射信息時失敗 - 因爲它不知道配置的UserType 所以我需要配置這些TypeDefinitions之前sessionFactory是實例化的 – 2010-01-21 23:24:58