2012-03-16 11 views
0

私はspring-security-aclプラグインを使用してACLセキュリティを実装しています。私は、次のドメインクラスを持っている:GrailsのセキュリティACLを使用してフィルタを選択するドロップダウン

package test 
class Subitem { 

    String name 

    static belongsTo = [employer: Employer] 

    static constraints = { 
    name blank: false 
    } 
} 

package test 
class Employer { 
    String name 

    static hasMany = [users: User, items: Subitem] 
    static belongsTo = User 

    static constraints = { 
    name blank: false, unique: true 
    } 

    String toString() { 
    name 
    } 
} 

サブアイテムを作成するために使用されるcreate.gspファイルでは、次の文があります:

<g:select id="employer" name="employer.id" from="${test.Employer.list()}" optionKey="id" required="" value="${subitemInstance?.employer?.id}" class="many-to-one"/> 

EmployerControllerから:

def list = { 
    params.max = Math.min(params.max ? params.int('max') : 10, 100) 
    [employerInstanceList: employerService.list(params), 
    employerInstanceTotal: employerService.count()] 
} 

hereというチュートリアルの後、私はEmployerを扱う機能のいくつかをEmployerServiceというサービスに移しました:

@PreAuthorize("hasRole('ROLE_USER')") 
@PostFilter("hasPermission(filterObject, read)") 
List<Employer> list(Map params) { 
    Employer.list params 
} 
int count() { 
    Employer.count() 
} 

特定のEmployerクラスインスタンス内の情報へのアクセスは、ACLを使用して制限されています。現在、私はドロップダウンのデータベース内のEmployerのインスタンスをすべて見ることができます。これは、サービスリスト()ではなくコントローラリスト()を使用していると仮定していますが、フィルタリングされたリスト雇用者ドメインクラスの私はグラムを交換する場合は、:を選択:

<g:select id="employer" name="employer.id" from="${test.EmployerService.list()}" optionKey="id" required="" value="${subitemInstance?.employer?.id}" class="many-to-one"/> 

私はサービスリスト()関数にマップパラメータを合格していない(と私はどのようにわからないので、私は内部サーバーエラーを取得します)タグ内でこれを行う:

URI /security/subitem/create 
Class groovy.lang.MissingMethodException 
Message No signature of method: static test.EmployerService.list() is applicable for argument types:() values: [] Possible solutions: list(java.util.Map), is(java.lang.Object), wait(), find(), wait(long), get(long) 

私だけEmployerServiceリストから()関数を付属の情報を見たい - 私はこれをどのように行うようにしてください?ギャップ内から正しい機能をどのように参照するのですか?

  • 編集08年3月16日0835:ありがとう@OverZealous、それは本当に役立つ、私はそれを実現していなかった。しかし、私はそれを試みても同じ問題を抱えています。私はEmployerとEmployerServiceの両方のlist()関数にprintln()ステートメントを入れて、g:selectタグが解析されたときに実際に呼び出されるようには見えません(g:selectを参照しても雇用者)。おそらく呼び出されている別のバージョンのlist()関数がありますか?または、他にどのようにg:ACLを考慮に入れて選択するのですか?

答えて

0

ただ、このように見えるサービスであなたのメソッドのシグネチャを変更します。

List<Employer> list(Map params = [:]) { 
    Employer.list params 
} 

変更は、この追加された:= [:]を。これは、paramsのデフォルト値を提供します。この場合、空のマップです。

(これはところであなたは、引数はオプションであり、デフォルトを提供したい任意の方法または閉鎖にそれを使用することができ、Groovyの機能です。)

+0

ありがとう、私はそれを知らなかった!しかし、g:selectがどのようにlist()関数を呼び出しているのか、ここでさらに根本的な問題があると思われます。上記の私の編集した質問を参照してください。 – John

0

OK、私はそれを働いた、とここ同じ問題を抱えている他の誰かの解決策です。

サブアイテムの作成ページは、サブアイテムのcreate.gspファイルとSubitemControllerを使用してレンダリングされます。だから今SubitemControllerをgに頼まれたとき

class SubitemController { 

def employerService 

def create() { 
    // this line was the default supplied method: 
    // [subitemInstance: new Subitem(params)] 
    // so replace with the following: 
    params.max = Math.min(params.max ? params.int('max') : 10, 100) 
    [subitemInstance: new Subitem(params), employerInstanceList: employerService.list(params), 
    employerInstanceTotal: employerService.count()] 
    } 
} 

:トリックはSubitemController )は(クロージャを作成し修正することで雇用のリストのためのサブ項目ビュー内で選択し、それがどの物資、EmployerServiceを呼び出します正しい答え。ビューに返される2つの変数を追加しただけで、ビュー内のどこでも参照できます(g:selectタグなど)。

私のレッスンは、ビューがコントローラを参照することができます。コントローラはサービスを参照することができます。サービスはビューでうまく動作しません。