Reputation: 618
The following action:
def addMembers(){
Map result = [message:"successful"]
try {
def group = Group.get(params.id)
def json = request.JSON
def users = json.users.collect{Usr.get(it.id)}
result.members = groupService.addMembers(group,users)
}catch(Exception e){
message = "Exception $e"
result.message = message
response.setStatus(hsr.SC_METHOD_NOT_ALLOWED)
}
respond result, [model:[result:result]]
}//eo addMember
In conjunction with the following addMembers.gson file
model {
Map result
}
json{
message result.message
members g.render(template:"simpleMember", collection: result.members, var:'member')
}
Gets a null pointer exception: java.lang.NullPointerException: Cannot get property 'message' on null object
I have things working well in other actions where I respond domain objects but the client side needs a message if I catch an exception and it really didn't seem worth it to create an arbitrary pogo when [message:"",members:[]] could do the same amount of work as an arbitrary extra file and an extra 5-10 lines of code.
Update 1 I tried replacing Map with an arbitrary ResultHolder class to placate any strict typing that might have been in play.
That didn't help
Update 2 In my .gson file I replaced
json{
with
json g.render(result){
And that gets me null output instead of null pointers.
Equally unacceptable.
Update 3 In order to try to assess how to interact with gson template without depending on ajax posts and database interaction I make the following arbitrary action:
def jsonDbug(){
def result = [message:"hi"]
respond result, [model:[jsonDbug:result]]
}
and an arbitrary gson file:
model{
Map jsonDebug
}
json{
says jsonDebug.message
}
This allows me to make changes faster to see what is going wrong. I'm trying calling in other ways except respond now but nothing works.
It's as if JSON views are strictly for domain objects and nothing else.
Upvotes: 2
Views: 1924
Reputation: 618
It turns out that I wasn't that very far off when I started. The problem was:
respond result, [model:[result:result]]
Which is the predominant example used at http://views.grails.org/latest/
When I changed to:
render(view:"addMembers", model:[result:result])
It worked exactly how I wanted it to.
Upvotes: 3