2013-01-17 26 views
10

Tôi đang cố gắng truy cập grailsApplication trong lớp groovy dưới src/groovy nhưng tôi nhận được một ngoại lệ con trỏ null. Tôi cũng đã cố gắng tiêm một dịch vụ vào cùng một lớp và cùng một kết quả. Làm cách nào để truy cập grailsApplication hoặc dịch vụ từ lớp học hấp dẫn? (Tôi đang sử dụng Grails 1.3.7)Truy cập grailsỨng dụng hoặc Dịch vụ trong lớp học hấp dẫn

+0

thể trùng lặp của [Grails dịch vụ 2.x tiêm trong Groovy/src] (http://stackoverflow.com/questions/10640480/grails-2-x-service-injection-in-groovy-src) – ataylor

Trả lời

5

Tiêm phụ thuộc không hoạt động đối với các lớp học hấp dẫn dưới src/groovy. Bạn có thể nhận được quyền truy cập vào grailsApplication sử dụng ApplicationHolder như thế này:

import org.codehaus.groovy.grails.commons.ApplicationHolder 

def grailsApplication = ApplicationHolder.application 

Bạn có thể truy cập tất cả các dịch vụ như thế này:

def allServicesArtefacts = grailsApplication.services 
+0

điều này làm việc như một sự quyến rũ! Cảm ơn rất nhiều ! –

+3

Đối với grails 1.3.7 nó là một giải pháp hoàn hảo. Tuy nhiên đối với grails v2 + bạn nên sử dụng giải pháp từ Tobias Kraft. – Archer

9

Lớp ApplicationHolder bị phản đối trong Grails phiên bản mới hơn (2.0 trở lên).

Có một cách khác, được mô tả trong một trong blogposts Burt của: http://burtbeckwith.com/blog/?p=1017

+1

thông tin tuyệt vời! cảm ơn! – Archer

+1

Tôi tự hỏi tại sao họ lại phản đối chủ sở hữu của họ và sau đó nói với chúng tôi để viết chủ sở hữu của chúng tôi. Nếu mô hình không hoàn thiện, tại sao họ không sửa lỗi triển khai của họ? –

+5

Bài đăng trên blog thường bị xóa - vì mục đích áp dụng, vui lòng bao gồm câu trả lời thực tế trong bài đăng của bạn, không chỉ là một liên kết! – nickdos

2

Nếu bạn có các lớp học mà bạn muốn tham gia với dependency injection từ src/groovy hoặc src/java hoặc thậm chí thứ 3 bên lọ tất cả các bạn phải làm là định cấu hình chúng trong grails-app/conf/spring/resources.groovy.

Nếu bạn có mypackage.MyClass lớp trong src/thư mục groovy của bạn trông như thế này:

package mypackage 
class MyClass{ 
    def grailsApplication 
    def myMethod(){ 
     //uses grailsApplication 
    } 
} 

Sau đó, bằng cách thêm dòng sau vào grails-app/conf/mùa xuân/resoruces.groovy nó sẽ nhận được tự động tiêm:

myClass(mypackage.MyClass){bean-> 
    bean.autowire = "byName"  
} 

này sẽ làm việc trong bất kỳ phiên bản của grails thusfar, và như tôi đã nói, bạn thậm chí có thể sử dụng lọ bên thứ 3 - ví dụ tôi luôn luôn có những điều sau đây trong resources.groovy tôi:

jdbcTemplate(org.springframework.jdbc.core.JdbcTemplate){ 
    dataSource = ref('dataSource') 
} 

Đối với toàn diện hơn see mùa xuân/tài liệu Grails:

http://grails.github.io/grails-doc/latest/guide/spring.html

1

Sau Grails 2.0, bạn nên sử dụng:

def grailsApplication = Holders.grailsApplication 
Các vấn đề liên quan