2013-10-27 43 views
1

我想对下面的类有一个过滤器(“辩论”)。默认情况下,我得到一个包含标题,发布和url的过滤器。这很好,但当我尝试过滤URL时,我得到以下异常。 “java.lang.String不能转换为java.net.URL”,查看底部的完整堆栈跟踪。Grails插件filterPane associatedProperties不适用于java.net.URL

为了解决这个问题,我添加了url.authority的associatedProperties,见下文。我想,因为filterpane是比较字符串,我会给它一个字符串(url.authority)。

问题是url.authority的associatedProperties永远不会出现在过滤器上。

我通过filterpane码看,我可以看到下面的代码

// Extract out the associations. These are handled separately from simple properties. 
List associatedProps = persistentProps.findAll { 
    it.association == true && !it.type.isEnum() 
} 

这是不包括url.authority因为url.authority不是一个单独的域。我可以把网址放到一个域中,我猜它会起作用,但我宁愿不这样做,因为它正在改变我的底层代码以迎合插件,这是非常糟糕的做法。

class Debate 
{ 
    String title; 
    Date published; 
    URL url; 

    static constraints = 
    { 
    url nullable : false, unique : true 
    } 
} 

顺便说一下,我试过没有excludeProperties,它没有区别。

<filterpane:filterPane dialog="true" domain="com.content.OpenDebate" 
associatedProperties="url.port" excludeProperties="url"/> 

堆栈跟踪

java.lang.String cannot be cast to java.net.URL. Stacktrace follows: 
java.lang.ClassCastException: java.lang.String cannot be cast to java.net.URL 
at   grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1587) 
at  org.grails.plugin.filterpane.FilterPaneService$_doFilter_closure4.doCall(FilterPaneService.groovy:153) 
at  org.grails.plugin.filterpane.FilterPaneService.doFilter(FilterPaneService.groovy:156) 
at  org.grails.plugin.filterpane.FilterPaneService.filter(FilterPaneService.groovy:12) 
at  com.keane.reg.opendebate.OpenDebateController$_closure1.doCall(OpenDebateController.groovy:29) 
at  grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:200) 
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 

BTW:为什么在世界上我会在标签restriced我可以用它来形容这个职位。我必须拥有1500或更高的声望才能包含filterpane和associatedproperties这两个字。这使得我的帖子不太可能得到回答。

回答

0

所以我在这方面花了足够的时间。我有一个解决方法。

我向我的域类添加了一个额外的域。这提供了我想过滤的url.authority。

我已经排除了过滤器的网址,并添加了作者。

请参阅下面的代码。

class Debate 
{ 
    String title; 
    Date published; 
    URL url; 

    // author derived from url 
    String getAuthor() 
    { 
    return(url.authority) 
    } 

    void setAuthor(String s) 
    { 
    // do nothing, just a dummy. 
    } 

    static constraints = 
    { 
    url nullable : false, unique : true 
    } 

    @Override 
    String toString() 
    { 
    return "${url} : ${title} : ${author} : ${published}"; 
    } 



<filterpane:filterPane dialog="true" domain="com.content.OpenDebate" 
filterProperties="${['author', 'title', 'published']}" 
filterPropertyValues="${[published:[precision:'day']]}"/> 
相关问题