1

以下のクラス(「討論」)にフィルターをかけたいと思います。デフォルトでは、タイトル、公開、URL を含むフィルターを取得します。それは問題ありませんが、URL をフィルターしようとすると、次の例外が発生します。「java.lang.String は java.net.URL にキャストできません」。完全なスタック トレースについては下部を参照してください。

これを回避するために、url.authority の associatedProperties を追加しました。以下を参照してください。filterpane は文字列と比較しているので、文字列 (url.authority) を指定します。

問題は、url.authority の associatedProperties がフィルターに表示されないことです。

フィルターペインのコードを調べたところ、次のコードが表示されました

// 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)

ところで: この投稿を説明するために使用できるタグが制限されているのはなぜですか。filterpane および associatedproperties という単語を含めるには、レピュテーションが 1500 以上である必要があります。これにより、私の投稿が回答される可能性が低くなります。

4

1 に答える 1

0

だから私はこれに十分な時間を費やしました。回避策があります。

ドメイン クラスに追加のフィールドを追加しました。これにより、フィルタリングしたい url.authority が提供されます。

フィルターから URL を除外し、作成者を追加しました。

以下のコードを参照してください。

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']]}"/>
于 2013-10-28T11:09:21.727 に答える