2009-04-21 29 views
4

我是Groovy的新手,我想修改一個我在互聯網上找到的例子(博客之一)。 我定義了兩個類文章和意見如下:Groovy在Grails上的初學者問題

class Post {  

static hasMany = [comments:Comment] 

String title 
String teaser 
String content  
Date lastUpdated 

SortedSet comments 

static constraints = { 
    title(nullable:false, blank:false, length:1..50) 
    teaser(length:0..100) 
    content(nullable:false, blank:false) 
    lastUpdated(nullable:true) 

} 

String toString() {title} 
} 

Post post 
String comment 
String name 
String url 
String email 
Date dateCreated = new Date() 


static belongsTo = Post 

static constraints = { 
    comment(nullable:false, blank:false) 
    name(nullable:false, blank:false) 
    url(nullable:true, blank:true, url:true) 
    email(nullable:true, blank:true, email:true) 
    dateCreated(nullable:true) 
    post(nullable:false) 
} 

public int compareTo(Object o) { 
    return dateCreated.compareTo(o.dateCreated) 
} 

String toString() {comment} 
}  

到現在爲止一切OK。

我定義控制器如下:

類CommentController {

def edit = { 
    render(view:'edit', 
     model:[ comment:new Comment(), 
       postId:params.postId])   
} 

def save = { 
    def comment = new Comment(params) 
    comment.dateCreated = new Date() 
    comment.post = Post.get(params.postId) 

    if(comment.save()) {   
     redirect(
       controller:'post', 
       action:'list', 
       id:params.postId) 
    } 
} 

}

class PostController { 

def defaultAction = 'list' 

def index = { 
    render("En el norte de Alabama") 
} 

def edit = { 
    render(view:'edit', model:[post:loadPost(params.id)]) 
} 

def save = { 
    def post = loadPost(params.id) 
    post.lastUpdated = new Date() 

    post.properties = params 
    if(post.save()) { 
     print "id " + post.id + "\n"  
     def offset = post.id - 1 
     print "offset " + offset 

     redirect(action:'list', offset:offset) 
    } else { 
     render(view:'edit', model:[post:post]) 
    } 
} 

def list = { 
    if(!params.max)params.max = 1 

    [ postList: Post.list(params) ] 

} 


def view = { 
    render(view:'view', model:[post:Post.get(params.id)]) 
} 

private loadPost(id) { 
    def post = new Post(); 
    if(id) { 
     post = Post.get(id) 
    } 
    return post 
} 
} 

最後我定義的意見/後/列表

如下:

<%@ page contentType="text/html;charset=UTF-8" %> 
<html> 
    <head><title>My postList</title> 
    </head> 
    <body> 
     <div class="nav"> 
    <g:link controller="post" action="edit">New post</g:link>    
     </div> 
      <span class="menuButton"><H1>Last posts</H1></span> 

<table border = 1><tr><td> 

<g:each in="${postList}" var="post"> 
<div> 
    <h2>${post.title}</h2> 
     <p>Last update: <g:formatDate date="${post.lastUpdated}" 
      format="yyyy-MMM-dd HH:mm"/></p> 
    <p><i>${post?.content}</i></p>  
</div> 

<div class="paginateButtons"> 
    <g:link controller="comment" action="edit" params="[postId:post.id]"> 
    Add comment   
    </g:link>    
</div> 


    <g:each in="${post.comments}" var="comt">   
    ${comt.comment} <br /> 
    </g:each>   
</g:each> 
<td></tr></table> 


<div class="paginateButtons"> 
     <g:paginate max="1" next="Next" prev="Prev." 
      total="${postCount == null ? Post.count(): postCount}" /> 
</div>  
</body> 
</html> 

我可以在沒有任何問題的情況下生成新帖子,但是當我想對我的帖子發表評論時,我最多可以爲每篇帖子發表一條評論。當試圖把更多的,我得到一個ClassCastException如下:

 
Message: Comment 
Caused by: Error processing GroovyPageView: Comment 
Class: /WEB-INF/grails-app/views/post/list.gsp 
At Line: [-1] 

org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: Comment 

    at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.handleException(GroovyPageView.java:134) 

    at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderWithTemplateEngine(GroovyPageView.java:112) 

    at org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderMergedOutputModel(GroovyPageView.java:86) 

    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:257) 

    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1183) 

    at org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(GrailsDispatcherServlet.java:294) 

    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) 

    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 

    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501) 

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 

    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) 

    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1124) 

    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70) 

    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 

    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70) 

    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 

    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) 

    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 

    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 

    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 

    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) 

    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:334) 

    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126) 

    at org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:293) 

    at org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:269) 

    at org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:261) 

    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.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 

    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.obtainContent(GrailsPageFilter.java:171) 

    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:110) 

    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 

    at org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:101) 

    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 

    at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:65) 

    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 

    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96) 

    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236) 

    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 

    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 

    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) 

    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 

    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 

    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 

    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) 

    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 

    at org.mortbay.jetty.Server.handle(Server.java:324) 

    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534) 

    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:864) 

    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533) 

    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207) 

    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403) 

    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 

    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522) 

Caused by: java.lang.ClassCastException: Comment 

    at java.util.TreeMap.compare(TreeMap.java:1093) 

    at java.util.TreeMap.put(TreeMap.java:465) 

    at java.util.TreeSet.add(TreeSet.java:210) 

    at java.util.AbstractCollection.addAll(AbstractCollection.java:318) 

    at java.util.TreeSet.addAll(TreeSet.java:258) 

    at D__Workspace_groovypublish_grails_app_views_post_list_gsp$_run_closure5.doCall(D__Workspace_groovypublish_grails_app_views_post_list_gsp:52) 

    at D__Workspace_groovypublish_grails_app_views_post_list_gsp.run(D__Workspace_groovypublish_grails_app_views_post_list_gsp:21) 

似乎是問題是在的list.gsp文件試圖把巢「每個」 S

任何暗示當

在此先感謝

路易斯

+1

你應該真的清理這個問題。某些代碼不在代碼塊中,或者完全丟失(註釋的類聲明在哪裏?) – billjamesdev 2009-04-21 17:31:12

回答

4

好,從我所讀到這裏,你使用的SortedSet爲你的容器類型的帖子。這很好,但是您必須使註釋實現Comparable,因爲這是所有包含SortedSet的對象的要求。你可能會希望按照dateCreated排序你的註釋,所以你必須在某處說(比如你需要滿足界面的compareTo函數)。

任何你不只是使用List的理由?好像你不想在早期日期添加評論。

無論如何,如果不是這樣,評論和我會採取更長的期待。

+0

我忘了發佈「評論」類。 現在我已經得到它的工作。 問題出現在兩處:Post和CommentController。 在Post Class中,我將註釋定義爲List而不是SortedSet。在CommentController中,我添加了這段代碼。 (評論) 現在正在工作。 感謝您在沒有它們的情況下提出的意見我無法獲得它的運行 順便說一句,亞馬遜將在下週發佈我訂購的Groovy圖書:-) – Luixv 2009-04-22 09:18:41

0

我同意比爾詹姆斯,但我認爲你應該注意到你對這個問題的分析有所改進。你的帖子有關於你的問題的良好數據。事實上,你擁有了你需要的一切。讓我們看看這個堆棧跟蹤。

下面是從TreeMap.java代碼:1093

private int compare(K k1, K k2) { 
    return (comparator==null ? ((Comparable</*-*/K>)k1).compareTo(k2) 
          : comparator.compare((K)k1, (K)k2)); 
} 

從這裏可以看到,註釋被轉換爲可比是問題。稍微查看一下TreeMap,TreeSet和Comparable可能會推動你解決這個問題。

請不要理解這篇文章,因爲在任何情況下,你的問題或問題。你的問題很好,而且問得很好。希望這是幫助你學會釣魚的另一點數據。