2011-06-07 29 views
0

更新:刚刚发现this bug看起来像我的问题。UrlMappings parseRequest:true会导致JSON异常无解析

我玩弄了一个纯JSON工作的客户端框架。我有一个urlMapping中为:

"/books/$id?"(controller:'book', parseRequest:true) { 
    action = [GET:'show',PUT:'update', POST:'save'] 
} 

问题是与在“显示”行动,如果没有ID传递到请求,我只是返回的所有书籍JSON列表:

def show = { 
    if (params.id) { 
     def bookInstance = Book.get(params.id) 
     render bookInstance as JSON 
    }else{ 
     render Book.list() as JSON 
    } 
} 

然而,由于没有JSON解析,我发现了以下异常:

2011-06-07 09:45:20,373 [http-8080-1] ERROR converters.JSONParsingParameterCreationListener - Error parsing incoming JSON request: Error parsing JSON 
org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Error parsing JSON 
    at grails.converters.JSON.parse(JSON.java:289) 
    at grails.converters.JSON.parse(JSON.java:311) 
    at grails.converters.JSON.parse(JSON.java:334) 
    at grails.converters.JSON$parse.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124) 
    at org.codehaus.groovy.grails.web.converters.JSONParsingParameterCreationListener.paramsCreated(JSONParsingParameterCreationListener.groovy:42) 
    at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest.informParameterCreationListeners(GrailsWebRequest.java:171) 
    at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:181) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.obtainContent(GrailsPageFilter.java:245) 
    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:134) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:104) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:69) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:69) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: org.codehaus.groovy.grails.web.json.JSONException: Missing value. at character 0 of 
    at org.codehaus.groovy.grails.web.json.JSONTokener.syntaxError(JSONTokener.java:473) 
    at org.codehaus.groovy.grails.web.json.JSONTokener.nextValue(JSONTokener.java:358) 
    at grails.converters.JSON.parse(JSON.java:280) 
    ... 44 more 

这是一个bug或者是有什么方法来告诉我们,如果没有JSON存在Grails的,只是不要试图解析什么?

回答

1

然而,由于没有JSON解析,我发现了以下异常:

我不知道为什么没有JSON解析。如果Book.list()在没有图书时返回空列表,则应该将其转换为空(JavaScript)数组。您可以通过运行下面的代码在Grails的控制台

import grails.converters.* 

String json = [] as JSON 
assert json == '[]' 

如果Book.list()返回空验证这一点,那么你可以很容易地用一个空的列表,通过改变

render Book.list() as JSON 

// If you like micro-optimizations, replace [] with Collections.emptyList() 
def allBooks = Book.list() ?: [] 
render allBooks as JSON 
更换
+0

这不是回应,而是(我认为)Grail正在考虑那些不存在的东西的请求。它不会阻止控制器响应。它在这个过程中向下倾斜。 – Gregg 2011-06-07 18:17:08

+0

我编辑了我的问题,并在Grails的JIRA中添加了一个错误链接,看起来像我的问题。 – Gregg 2011-06-07 18:19:56