我想对下面的课程(“辩论”)进行过滤。默认情况下,我得到一个包含标题、已发布和 url 的过滤器。这很好,但是当我尝试对 URL 进行过滤时,我得到以下异常。“java.lang.String 无法转换为 java.net.URL”,完整堆栈跟踪请参见底部。
为了解决这个问题,我添加了 url.authority 的关联属性,见下文。我想,因为 filterpane 正在与一个字符串进行比较,所以我会给它一个字符串(url.authority)。
问题是 url.authority 的相关属性从未出现在过滤器上。
我查看了过滤窗格代码,可以看到以下代码
// 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 和相关属性。这使我的帖子不太可能得到答复。