Our effort to build WS Human Task implementation was donated to The Apache Software Foundation. Proposal can be seen here. Apache HISE Project page contains up to date information.
Our effort to build WS Human Task implementation was donated to The Apache Software Foundation. Proposal can be seen here. Apache HISE Project page contains up to date information.
I've encountered strange behavior with a domain class in my project: services that should be injected were null. I've became suspicious as why is that? Services are injected properly in other domain classes so why this one is different?
I've created an experiment. I've created empty LibraryService that should be injected and Book domain class like this:
class Book {
def libraryService
String author
String title
int pageCount
Book() {
println("Finished constructor Book()")
}
Book(String author) {
this()
this.@author = author
println("Finished constructor Book(String author)")
}
Book(String author, String title) {
super()
this.@author = author
this.@title = title
println("Finished constructor Book(String author, String title)")
}
Book(String author, String title, int pageCount) {
this.@author = author
this.@title = title
this.@pageCount = pageCount
println("Finished constructor Book(String author, String title, int pageCount)")
}
void logInjectedService() {
println(" Service libraryService is injected? -> $libraryService")
}
}
class LibraryService {
def serviceMethod() {
}
}
Book
has 4 explicit constructors. I want to check which constructor is injecting dependecies. This is my method that constructs Book
objects and I called it in controller:
class BookController {
def index() {
constructAndExamineBooks()
}
static constructAndExamineBooks() {
println("Started constructAndExamineBooks")
Book book1 = new Book().logInjectedService()
Book book2 = new Book("foo").logInjectedService()
Book book3 = new Book("foo", 'bar').logInjectedService()
Book book4 = new Book("foo", 'bar', 100).logInjectedService()
Book book5 = new Book(author: "foo", title: 'bar')
println("Finished constructor Book(Map params)")
book5.logInjectedService()
}
}
Output looks like this:
Started constructAndExamineBooks
Finished constructor Book()
Service libraryService is injected? -> eu.spoonman.refaktor.LibraryService@2affcce2
Finished constructor Book()
Finished constructor Book(String author)
Service libraryService is injected? -> eu.spoonman.refaktor.LibraryService@2affcce2
Finished constructor Book(String author, String title)
Service libraryService is injected? -> null
Finished constructor Book(String author, String title, int pageCount)
Service libraryService is injected? -> null
Finished constructor Book()
Finished constructor Book(Map params)
Service libraryService is injected? -> eu.spoonman.refaktor.LibraryService@2affcce2
What do we see?
Always explicitily invoke empty constructor in your Grail domain classes to ensure Dependency Injection! I didn't know until today either!