我使用以下Grails代码将SomeClass
-objects的集合呈现为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转换器无法转换空元素(整个字段或仅列表元素)。
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]
}
真的很奇怪的定义。 静态hasMany = [a:A,b:B,c:C] 尝试创建三个字段 a,b,c ,每个字段的类型为 java.util.Set 。只需尝试以下定义:
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]
}
由于动态打字性质而工作。在这里,您没有严格的类型检查,并且可以轻松地将变量重新分配给其他类型。
关于grails - Grails “render as XML”抛出java.lang.NullPointerException-我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3919442/