【问题标题】:Beginners problem with Groovy on GrailsGrails 上 Groovy 的初学者问题
【发布时间】:2009-04-21 16:21:59
【问题描述】:

我是 Groovy 的新手,我想修改我在 Internet 上找到的一个示例(博客示例)。 我定义了两个类 Post 和 Comment 如下:

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

到目前为止一切正常。

我已将控制器定义如下:

类评论控制器 {

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>

我可以毫无问题地生成新帖子,但是当我想在我的帖子中添加 cmets 时,我最多可以为每个帖子添加一条评论。当试图放更多时,我得到一个 ClassCastException 如下:

留言:评论 原因:处理 GroovyPageView 时出错:注释 类:/WEB-INF/grails-app/views/post/list.gsp 在线:[-1] org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException:错误处理 GroovyPageView:评论 在 org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.handleException(GroovyPageView.java:134) 在 org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderWithTemplateEngine(GroovyPageView.java:112) 在 org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderMergedOutputModel(GroovyPageView.java:86) 在 org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:257) 在 org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1183) 在 org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(GrailsDispatcherServlet.java:294) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 在 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1124) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) 在 org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:334) 在 org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126) 在 org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:293) 在 org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:269) 在 org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:261) 在 org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:181) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 在 org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.obtainContent(GrailsPageFilter.java:171) 在 org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:110) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 在 org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:101) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 在 org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:65) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:324) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534) 在 org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:864) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522) 引起:java.lang.ClassCastException:注释 在 java.util.TreeMap.compare(TreeMap.java:1093) 在 java.util.TreeMap.put(TreeMap.java:465) 在 java.util.TreeSet.add(TreeSet.java:210) 在 java.util.AbstractCollection.addAll(AbstractCollection.java:318) 在 java.util.TreeSet.addAll(TreeSet.java:258) 在 D__Workspace_groovypublish_grails_app_views_post_list_gsp$_run_closure5.doCall(D__Workspace_groovypublish_grails_app_views_post_list_gsp:52) 在 D__Workspace_groovypublish_grails_app_views_post_list_gsp.run(D__Workspace_groovypublish_grails_app_views_post_list_gsp:21)

似乎问题出在 list.gsp 文件中,当尝试放置嵌套的“每个”时

任何提示

提前致谢

路易斯

【问题讨论】:

  • 你真的应该清理这个问题。某些代码超出了代码块,或者完全丢失(Comment 的类声明在哪里?)

标签: exception grails groovy


【解决方案1】:

嗯,从我在这里看到的内容来看,您使用 SortedSet 作为帖子中评论的容器类型。这很好,但是您必须使 Comments 实现 Comparable,因为这是所有包含 SortedSet 的对象的要求。无论如何,您可能希望您的 cmets 按 dateCreated 排序,因此您必须在某处说明(例如在 compareTo 函数中您需要满足接口)。

您不只是使用列表的任何原因?看来您无论如何都不想添加日期较早的评论。

无论如何,如果不是这样,请发表评论,我会再看一看。

【讨论】:

  • 我忘记发布“评论”课程了。现在我已经开始工作了。问题出在两个地方:The Post 和 CommentController。在 Post Class 中,我将 cmets 定义为 List 而不是 SortedSet。在 CommentController 我添加了这段代码。 comment.post = Post.get(params.postId) post.addToComments(comment) 现在正在工作。感谢您的 cmets 没有他们我无法让它运行顺便说一句,亚马逊将在下周交付我订购的 Groovy 书籍 :-)
【解决方案2】:

我同意比尔詹姆斯的观点,但我认为您应该注意到您对这个问题的分析有所改进。您的帖子围绕您的问题提供了良好的数据。事实上,你拥有你需要的一切。让我们看看那个堆栈跟踪。

这里是 TreeMap.java 中的代码:1093

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

从这里您可以看到将 Comment 强制转换为 Comparable 是问题所在。稍微了解一下 TreeMap、TreeSet 和 Comparable 可能会让您解决这个问题。

请不要将这篇文章解释为以任何方式质疑您的问题或问题。你的问题很好,问得很好。希望这是帮助您学习钓鱼的另一个数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2020-11-23
    • 2015-03-16
    • 2012-04-15
    相关资源
    最近更新 更多