2010-10-12 47 views
0

我用下面的Grails代码来呈现的SomeClass -objects集合作为XML:Grails“render as XML”抛出java.lang.NullPointerException - 我做错了什么?

def someObjects = SomeClass.findAllByFoo(foo) 
if (someObjects) { 
    render(contentType:"text/xml", text:someObjects as XML) 
} 

可正常工作的大部分时间。然而,有时并取决于someObjects代码失败,出现以下NullPointerException内容(请注意,someObjects != null):

java.lang.NullPointerException 
    at grails.converters.XML.getElementName(XML.java:128) 
    at grails.converters.XML.convertAnother(XML.java:163) 
    at grails.converters.XML.convertAnother(XML.java:163) 
    at grails.converters.XML.convertAnother(XML.java:163) 
    at grails.converters.XML.render(XML.java:111) 
    at grails.converters.XML.toString(XML.java:281) 
    at project.SomethingController$_closure8.doCall(project.SomethingController:217) 
    at project.SomethingController$_closure8.doCall(project.SomethingController) 
    at java.lang.Thread.run(Thread.java:637) 

这是SomeClass类的定义:

class SomeClass { 
    List<A> a = new ArrayList<A>() 
    List<B> b = new ArrayList<B>() 
    List<C> c = new ArrayList<C>() 
    static hasMany = [a : A, b : B, c : C] 
} 

我已经发现异常,可以通过改变SomeClass定义简单地回避:

class SomeClass { 
    def a = new ArrayList<A>() 
    def b = new ArrayList<B>() 
    def c = new ArrayList<C>() 
    static hasMany = [a : A, b : B, c : C] 
} 

我的问题1 ons是:

  • 我在与“呈现为XML”的交互中做错了什么?预计NPE在这里吗?
  • 为什么后者的SomeClass定义有效,而前者没有?

回答

1

它似乎是定义中的问题,因为XML转换器不能转换空元素(整个字段或列表元素)。

class SomeClass { 
    List<A> a = new ArrayList<A>() 
    List<B> b = new ArrayList<B>() 
    List<C> c = new ArrayList<C>() 
    static hasMany = [a : A, b : B, c : C] 
} 

真的很奇怪的定义。 static hasMany = [a:A,b:B,c:C]试图创建三个字段a,b,c,每个字段的类型为java.util.Set。索只是尝试这样的定义:

class SomeClass { 
     static hasMany = 
     [ 
      a : A, 
      b : B, 
      c : C 
     ] 
    } 

它必须确定。

你examle:

class SomeClass { 
    def a = new ArrayList<A>() 
    def b = new ArrayList<B>() 
    def c = new ArrayList<C>() 
    static hasMany = [a : A, b : B, c : C] 
} 

工作,因为动态类型性质。在这里你没有严格的类型检查,变量可以很容易地重新分配给不同的类型。