2012-10-31 15 views
6

Khi ứng dụng Grails của tôi khởi động, tôi cũng bắt đầu một Spring Integration và Batch process trong nền. Tôi muốn có một số thuộc tính kết nối DB được lưu trữ trong tệp Config.groovy, nhưng làm cách nào để truy cập chúng từ một lớp Java được sử dụng trong quy trình Tích hợp/Batch?Truy cập Config.groovy từ lớp Java

tôi thấy chủ đề này:

Converting Java -> Grails ... How do I load these properties?

nào cho thấy sử dụng:

private Map config = ConfigurationHolder.getFlatConfig(); 

tiếp theo một cái gì đó như:

String driver = (String) config.get("jdbc.driver"); 

Điều này thực sự hoạt động tốt (teh tính được nạp chính xác từ Config.groovy) nhưng vấn đề là t hat ConfigurationHolder là sau khi không được chấp nhận. Và bất kỳ chủ đề Tôi đã tìm thấy đối phó với vấn đề này có vẻ là Grails cụ thể và đề nghị sử dụng tiêm dependancy, như trong luồng này:

How to access Grails configuration in Grails 2.0?

Vậy là có một cách không phản đối để có được quyền truy cập vào các Các thuộc tính Config.groovy từ một tệp lớp Java?

+0

Có gì sai với phương pháp thứ hai trong [câu trả lời được chấp nhận của câu hỏi bạn đã liên kết tới] (http://stackoverflow.com/a/7136095/6509)? –

+0

Hi Tim, chúc mừng bạn đã trả lời. Tôi đặt trong lớp java của tôi như là một bean trong tệp tài nguyên (với một thuộc tính của grailsApplication và một ref của grailsApplication), và thêm dòng sau vào lớp của tôi: private GrailsApplication grailsApplication; với getter và setter. Nhưng khi tôi cố gắng truy cập nó thông qua ConfigObject config = grailsApplication.getConfig(); nó có vẻ là null và lỗi. Bất kỳ ý tưởng những gì tôi đang làm sai? Cảm ơn – Illu

+0

Bạn đang cố truy cập vào đâu? Bạn không thể sử dụng bean phụ thuộc được tiêm trong constructor, ví dụ, bạn cần khai báo một phương thức được chú thích bằng '@ PostConstruct' và đặt logic cần' grailsApplication' vào đó thay vào đó, hoặc sử dụng cách tạo đối số constructor thay vì tiêm setter. –

Trả lời

1

Tôi không thể giải thích tại sao điều này không hiệu quả, nhưng tôi có thể đề xuất một phương pháp thay thế hoàn toàn. Grails thiết lập một PropertyPlaceholderConfigurer mà mất giá trị của nó từ grailsApplication.config, vì vậy bạn có thể khai báo một

public void setDriver(String driver) { ... } 

về lớp học của bạn và sau đó nói

<bean class="com.example.MyClass" id="exampleBean"> 
    <property name="driver" value="${jdbc.driver}" /> 
</bean> 

này cũng hoạt động trong resources.groovy nếu bạn đang sử dụng đậu DSL, nhưng bạn phải nhớ sử dụng các dấu ngoặc đơn đơn thay vì gấp đôi:

exampleBean(MyClass) { 
    driver = '${jdbc.driver}' 
} 

Sử dụng "${jdbc.driver}" không hoạt động vì Groovy được giải thích bởi GString và (không thể) được giải quyết khi xử lý resources.groovy, trong khi những gì bạn cần là đặt biểu thức ${...} theo nghĩa đen khi giá trị thuộc tính được giải quyết sau đó bởi trình giữ chỗ configurer.

3

Chỉ cần kiểm tra ở một số mã hiện tại của tôi, và tôi sử dụng this method described by Burt Beckwith

Tạo một file mới: src/groovy/ctx/ApplicationContextHolder.groovy

package ctx 

import org.springframework.context.ApplicationContext 
import org.springframework.context.ApplicationContextAware 
import javax.servlet.ServletContext 

import org.codehaus.groovy.grails.commons.GrailsApplication 
import org.codehaus.groovy.grails.plugins.GrailsPluginManager 
import org.springframework.context.ApplicationContext 
import org.springframework.context.ApplicationContextAware 

@Singleton 
class ApplicationContextHolder implements ApplicationContextAware { 
    private ApplicationContext ctx 

    private static final Map<String, Object> TEST_BEANS = [:] 

    void setApplicationContext(ApplicationContext applicationContext) { 
    ctx = applicationContext 
    } 

    static ApplicationContext getApplicationContext() { 
    getInstance().ctx 
    } 

    static Object getBean(String name) { 
    TEST_BEANS[name] ?: getApplicationContext().getBean(name) 
    } 

    static GrailsApplication getGrailsApplication() { 
    getBean('grailsApplication') 
    } 

    static ConfigObject getConfig() { 
    getGrailsApplication().config 
    } 

    static ServletContext getServletContext() { 
    getBean('servletContext') 
    } 

    static GrailsPluginManager getPluginManager() { 
    getBean('pluginManager') 
    } 

    // For testing 
    static void registerTestBean(String name, bean) { 
    TEST_BEANS[name] = bean 
    } 

    // For testing 
    static void unregisterTestBeans() { 
    TEST_BEANS.clear() 
    } 
} 

Sau đó, chỉnh sửa grails-app/config/spring/resources.groovy bao gồm:

applicationContextHolder(ctx.ApplicationContextHolder) { bean -> 
    bean.factoryMethod = 'getInstance' 
    } 

Sau đó, trong các tệp của bạn bên trong src/java hoặc src/groovy, bạn có thể gọi:

GrailsApplication app = ApplicationContextHolder.getGrailsApplication() ; 
ConfigObject config = app.getConfig() ; 
4

Chỉ cần đăng ký, trong Grails 2.x, có Holders class để thay thế chủ sở hữu không còn được dùng nữa. Bạn có thể sử dụng quyền này để truy cập grailsApplication trong ngữ cảnh tĩnh.

+0

Điều này dường như thay thế [ApplicationContextHolder] của Burt (http://burtbeckwith.com/blog/?p=1017) vì nó cung cấp nhiều nhất từ ​​giải pháp đó, cũng giải quyết vấn đề gán tĩnh. – raffian