2011-11-03 24 views
10

Tôi nhận ra rằng các lớp dịch vụ Grails là Spring managed singletons. Tôi cũng biết rằng bạn có thể tham khảo một lớp dịch vụ từ một lớp khác bằng cách chỉ khai báo một lỗi cục bộ với serviceClassName trong trường hợp lạc đà như thế. Điều làm tôi ngạc nhiên là tôi dường như không thể vượt qua các lớp dịch vụ tham chiếu với nhau như vậyGrails service class cross ref

class FirstService { 

    def secondService 
... 
} 

class SecondService { 

    def firstService 
... 
} 

Điều này có đúng với mọi người, hoặc tôi đã làm lộn xộn ở đâu đó trong phần ...?

Trả lời

14

Grails không thể tiêm khi có tham chiếu vòng tròn. Bạn thực sự sẽ nhận được một ngoại lệ dọc theo các dòng của FactoryBean is not fully initialized yet. Có một vấn đề JIRA về vấn đề này, nơi họ nói rằng họ sẽ không được sửa chữa này, vì nó là nhiều việc phải làm với mùa xuân hơn Grails (http://jira.grails.org/browse/GRAILS-5080)

Tuy nhiên, có một cách giải quyết khác được trích dẫn trong JIRA và tôi có thể xác minh không làm việc với Grails 2.0.RC1. Trong SecondService, làm cho nó protected def firstService và thêm def grailsApplication bên dưới và sau đó thêm phương thức def initialize() { this.firstService = grailsApplication.mainContext.firstService }. Cuối cùng, trong BootStrap.groovy, hãy thêm def firstService và sau đó trong phần đóng cửa init, hãy thêm secondService.initialize(). Không phải là một giải pháp khá, nhưng điều này sẽ nhận được tất cả mọi thứ nối theo cách bạn muốn nó.

+1

cảm ơn bạn đã xác nhận rằng tôi không phát điên :) – dbrin

+0

Todd, ý của bạn là 'def secondService' trên Bootstrap? –

+0

Không, bởi vì '' 'def firstService''' sẽ khiến nó được tiêm vào ngữ cảnh ứng dụng, do đó khi khởi tạo được chạy trên secondService, nó sẽ có thể lấy ra firstService từ' '' grailsApplication.mainContext'' ' – Todd