0

さまざまな種類のレポートをドメイン オブジェクトとして保存する Web アプリを作成しているため、HeadOfHousehold名前データを含むドメイン オブジェクトとreports、 、addresses、依存関係などの他のドメイン オブジェクトへの参照があります。最近表示/作成されたオブジェクトのリストを作成しようとしていHeadOfHouseholdます。Google で何度も検索し、マニュアルを精査した結果、サービスが適切なソリューションであることがわかりました。だから私は作成しましたClientListService

@Transactional
class ClientListService {
    static scope = "session"
    String message // right now I'll be happy to just see the same message across 
                  // pages I can add a list and manipulate it later.
}

その後、さまざまなコントローラーで参照できると思いましたが、次のようなものが持続します。

def clientListService

def index(){
    hasSearched = false
    clientListService = new ClientListService(message: "Hello")
    [errorMessage: params.errorMessage, clients:clientListService]

}

後のコントローラーで利用できるはずです:

class HeadOfHouseHoldController {
     def clientListService
    def index() {

        [customer: HeadOfHousehold.get(params.id), clients: clientListService]
    }//...

ただし、メッセージを取得しようとすると、オブジェクトが null のように見えます。私のindex.gspから:

***************${clients?.message}********************

したがって、セッションを適切に定義していないか (そうするために特別なことをしていない)、セッション スコープがどのように機能するかを誤解しているか、または何か他のことをしていないかどうかはわかりません。オブジェクトを定義した元のページに適切なメッセージが表示されますが、後続のページには表示されません。

また、これが適切な方法であるかどうかもわかりません。今、私が本当に必要としているのは、必要なリストHeadOfHouseholdsだけです (他のページからリストに追加できるようにするため)。ただし、他のロジックやアイテムをそのようなクラスに追加する可能性があることがわかります。

4

1 に答える 1

2

session範囲を正しく理解したと思います。セッション スコープを持つ各 Spring Bean は、HTTP セッションにバインドされます。

しかし、最初のコントローラーのリストはすべて間違っています。サービス クラスを自分でインスタンス化することは想定されていません。これが、Spring (Grails) が行うことです。

class FooController {
   def clientListService // gets autowired by Grails/Spring

   def index(){
       hasSearched = false
       clientListService.message = 'Hello' // only assign a String value to the service
       [errorMessage: params.errorMessage, clients:clientListService]
   }
}

これは、次のようなことはできないことを意味します

clientListService = new ClientListService(message: "Hello")

コードが機能することを期待してください。お役に立てれば。

于 2014-06-12T06:23:39.607 に答える