开发者

Using resources.groovy to define services

开发者 https://www.devze.com 2023-04-11 07:23 出处:网络
I\'m using the resources.groovy to declare a service e.g. aService(com.foo.OrganizationService) so that I can tie aService to my controllers instead of using organizationService which could change

I'm using the resources.groovy to declare a service e.g.

aService(com.foo.OrganizationService)

so that I can tie aService to my controllers instead of using organizationService which could change in the future.

I've noticed that the OrganizationService doesn't get treated special like other services "not" declared in the resources.groovy. For example it doesn't get injected with grailsApplication, and likely a hibernateSession etc and other things I've not hit yet....

Now, I know I can manually wire in stuff to my service but开发者_StackOverflow中文版 I'd rather not have to maintain that...

Is there a special way to declare a service in the resources.groovy so that gets treated like another service that grails loads up?

TIA


The short answer to your question is "no".

Under the covers, Grails services are driven by some intelligent code that is referencing a specific location and expecting certain properties.

Viewing the source code (especially around the ServicesGrailsPlugin.groovy) is a good way to see the "magic" in how these are wired together.

Is there a reason you wouldn't want to use a bonafide Grails service to solve your problem? If you are expecting things like a grailsApplication, it seems like that use is pretty specific to Grails and would be a good candidate for porting over to a "true" Grails service.

Good luck!


So I've come full circle on this. This is a timing problem. Where services haven't been grails initialized yet.

Basically when you use the resources.groovy to do service wiring you run the risk of using a Service that might initialize itself e.g. afterPropertiesSet method or static initializers that use grails services (log, hibernate session, ..) that haven't been injected yet.

So... What I've turned to instead is to create my own BeanBuilder in a BootStrap.groovy file.

        BeanBuilder builder = new BeanBuilder(grailsApplication.parentContext)
    def bb = builder.beans {
        LoginListener(com.foo.LoginListener) {
            springSecurityService = ref("springSecurityService")
            userService = ref("userService")
        }
    }
    bb.registerBeans(grailsApplication.mainContext)
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号