Grails“render as XML”抛出java.lang.NullPointerException - 我做错了什么?

时间:2010-10-12 22:06:34

标签: grails gorm

我使用以下Grails代码将SomeClass - 对象的集合呈现为XML:

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]
}

我的问题是:

  • 在与“渲染为XML”的交互中,我做错了什么? NPE是否在这里预期?
  • 为什么后面的SomeClass定义有效,而前者没有?

1 个答案:

答案 0 :(得分:1)

似乎定义中存在问题,因为XML转换器无法转换null元素(整个字段或只是列表元素)。

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 即可。 Sot只是尝试这个定义:

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

必须没问题。

你的考试:

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]
}
由于动态打字性质,

正在运行。在这里,您没有严格的类型检查,并且可以轻松地将变量重新分配给不同类型。