2009-04-21 13 views
4

私はGroovyの初心者です。私はインターネットで見つけた1つの例(ブログ1)を修正したいと思います。 次のように私は2つのクラスのポストとコメントを定義しました: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> 

私は新しい投稿を問題なく生成することができますが、投稿にコメントを追加する場合は、投稿ごとに最大1つのコメントを付けることができます。もっと入れしようとすると、次のように私は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) 

「は、各」S

どれヒント

ネストされたを置くしようとしたときに問題がlist.gspファイルであることをしているようです私はあなたがポストのコメントのためのあなたのコンテナタイプとしてにSortedSetを使用している、ここで読むことができるものから事前に

おかげ

ルイス

+1

本当にこの問題を解決する必要があります。いくつかのコードがコードブロックから外れているか、または完全に欠落しています(コメントのクラス宣言はどこですか?) – billjamesdev

答えて

4

まあ、。これは問題ありませんが、CommentsはComparableを実装する必要があります。これは、すべてのSortedSetに含まれるオブジェクトの要件です。とにかくあなたのコメントをdateCreatedでソートしたいと思うでしょう。だから、どこかでSAYしなければなりません(compareTo関数のように、インターフェースを満足させる必要があります)。

あなたは単にリストを使用していないのですか?とにかく以前の日付のコメントを追加したくないようです。

とにかく、これがそうでない場合は、コメントと私はより長く見ていきます。

+0

私は "コメント"クラスを投稿することを忘れてしまった。 これで動いています。 この問題は、PostとCommentControllerの両方の場所で発生していました。 投稿クラスでは、コメントをSortedSetとしてではなくListとして定義しました。 CommentControllerではこのコードを追加しました。 comment.post = Post.get(params.postId) post.addToComments(コメント) 現在作業中です。 私はそれを実行できないあなたのコメントのためにありがとう 、アマゾンは来週私が注文したGroovyの本を提供しています:-) – Luixv

0

私はBill Jamesに同意しますが、この問題の分析が改善されていることに注意してください。あなたの投稿にはあなたの質問を取り巻く良好なデータがありました。実際には、あなたは必要なものすべてを持っていました。そのスタックトレースを見てみましょう。 1093

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

ここからは、あなたが同等にキャストされているというコメントが問題だった見ることができます:ここで

はTreeMap.javaからのコードです。 TreeMap、TreeSet、Comparableをちょっと見れば、おそらくこの問題があなたを押し倒してしまったでしょう。

あなたの質問や問題を避けているように、この投稿を解釈しないでください。あなたの質問は良い、よく聞かれます。これはうまくいけば、あなたが魚を学ぶのを助けるもう一つのビットのデータです。