Grails插件filterPane associatedProperties不适用于java.net.URL

时间:2013-10-27 17:12:55

标签: url grails filter pane

我希望在下面的课程中有一个过滤器(“辩论”)。默认情况下,我得到一个包含标题,已发布和网址的过滤器。这很好但是当我尝试过滤URL时,我得到以下异常。 “java.lang.String无法强制转换为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不是一个单独的域。我可以将url放入域中,我猜它会起作用,但我宁愿不这样做,因为它正在改变我的底层代码以满足插件的需要,这是非常糟糕的做法。

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)

顺便说一句:为什么在世界上我限制了我可以用来描述这篇文章的标签。我必须具有1500或更高的声誉才能包含单词filterpane和associatedproperties。这使我的帖子不太可能被回答。

1 个答案:

答案 0 :(得分: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']]}"/>