2009-04-21 46 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可能会推动你解决这个问题。

请不要理解这篇文章,因为在任何情况下,你的问题或问题。你的问题很好,而且问得很好。希望这是帮助你学会钓鱼的另一点数据。