Warum Grails werfen Null Zeiger Ausnahme beim ersten Zugriff auf hasMany Beziehung?
Habe ich ein komisches problem.
Ich habe zwei domain-Klassen User
und Post
mit Feldern:
class User {
String name
static hasMany = [posts: Post]
static constraints = { }
}
und
class Post {
String content
long date = System.getTimeInMillis()
static constraints = { }
static belongsTo = [user: User]
static mapping = {
version: 'false'
}
}
- und controller-code ist:
class UserController {
def addUser = {
def user
if (User.count() == 0) {
user = new User()
user.name = "Manish Zedwal"
user.save(flush: true)
} else {
user = User.get(1)
}
println "Posts count: " + user.posts.size()
render "post count: " + user.posts.size()
}
}
Zum ersten mal während des Zugriffs auf die url http://localhost:8080/test/user/addUser
ist, wird null-Zeiger-Ausnahme, aber nach dieser gut funktioniert.
Dies ist die Ausnahme, ich bin immer
2011-08-04 15:41:25,847 [http-8080-1] ERROR errors.GrailsExceptionResolver - Exception occurred when processing request: [GET] /test/user/addUser
Stacktrace follows:
java.lang.NullPointerException: Cannot invoke method size() on null object
at test.UserController$_closure2.doCall(UserController.groovy:18)
at test.UserController$_closure2.doCall(UserController.groovy)
at java.lang.Thread.run(Thread.java:636)
und zum zweiten mal, er druckt und macht feinen Charme wie
Posts count: 0
Benutzer In der domain-Klasse, coz der hasMany
Beziehung für posts
posts
ist eine Liste von Post
Objekte, dann sollte es kein null-Zeiger-Ausnahme auf die Größe von leer-Liste sein, sondern es sollte gleich null sein.
Jede Hilfe dankbar
InformationsquelleAutor der Frage mj.scintilla | 2011-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie anzeigen eine Sammlung wie die, die
hasMany
Erklärung fügt ein Feld vom TypSet
mit dem angegebenen Namen (in diesem Fallposts
) zu Ihrer Klasse. Es muss nicht initialisiert den Satz aber so ist es zunächst null. Wenn Sie anrufenaddToPosts
es wird überprüft, ob es die null und erstellt eine neue, leere Menge, falls erforderlich, ergänzt um den Beitrag der Sammlung. Aber wenn Sie nicht, rufen SieaddToPosts
oder explizit initialisieren gesetzt ist, wird null sein.Beim laden einer
User
aus der Datenbank, Hibernate füllen Sie alle Felder, und die Sammlung ist im Lieferumfang enthalten. Es erstellt eine neue Reihe (eine änderung-bewusstPersistentSet
), die leer ist, und fügt hinzu, Instanzen, wenn es irgendwelche. Aufrufsave()
laden nicht die Instanz aus der Datenbank, also die leere Menge ist immer noch null sein.Um die Klasse auf die gleiche Weise Verhalten, wenn es neu ist und wenn es persistent ist, können Sie ein Feld hinzufügen, um Ihre Klasse Wie Rob zeigte in seiner Antwort, initialisiert ein leeres set (
Set posts = []
)InformationsquelleAutor der Antwort Burt Beckwith
Dies können Sie verhindern, indem Sie explizit deklarieren Ihre Sammlung-Eigenschaft (mit einem Wert) neben der Zuordnung:
Definieren Sie den collection-Typ, die Sie benötigen. Der Standardwert ist
Set
aber wenn Sie benötigen, um für Ordnung zu sorgen, sollten SieList
oderSortedSet
.InformationsquelleAutor der Antwort Rob Hruska