1

ドメインにサービスをインポートするには?

フィールドにプロトコルを入力する必要があるフィールドがあります。プロトコルは自動的に生成され、この世代専用のサービスが作成されます。

メソッド 'AfterInsert' のフィールドに、フィールドに自動的に入力するこのサービスへの呼び出しが挿入されました。

このプロトコルでフィールドに入力する必要があるいくつかのオブジェクトの作成をブートストラップします。しかし、「ドメイン」での「サービス」の使用が原因であると思われるエラーが発生します。誰でも私を助けることができますか?

class Post {

    static transient postService

    String conteudo
    Date dataCriacao = new Date()
    String protocolo

    static constraints = {

        dataCriacao(nullable:false, blank:false)
        conteudo nullable:false, blank: false 
        protocolo nullable: true, blank: true 

    }

    static mapping = {  
        conteudo type: 'text'
        sort dataCriacao:"desc"   
    }

    def afterInsert(){
        if(!this.protocolo){                   
            registraProtocolo()
        }
    }

    protected void registraProtocolo() {
       postService.teste(this)
    }
}

Error: ERROR hibernate.AssertionFailure  - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
Message: null id in com.app.post.Post entry (don't flush the Session after an exception occurs)
    Line | Method
->>  105 | doCall             in org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2

Message: null id in com.app.post.Post entry (don't flush the Session after an exception occurs)
    Line | Method
->>  105 | doCall             in org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     27 | recInsertProtocolo in com.app.post.PostService
|     83 | teste . . . . . .  in     ''
|    117 | registraProtocolo  in com.app.post.Post
4

3 に答える 3

4

静的であってはpostServiceならず、単純にすべきです

transient postService
于 2012-10-08T17:49:19.087 に答える
1

問題が解決しました!それは論理の問題です。サービスは自動的に 'transational = true' として設定され、AfterInsert を使用すると、サービスのこの機能が原因でエラーが発生します。しかし、クロージャー「withNewSession」を使用すると、この問題は解決され、新しいセッションが要件「transational」を満たすと、サービスを使用してオブジェクトの属性を変更できるようになります。次のようにドメインを取得しました。

AfterInsert def () {

     if (! this.protocolo) {

             Post.withNewSession
             {

                  registraProtocolo ()


             }

     }

 }

 protected void registraProtocolo () {
    postService.teste (this)
 }

助けてくれてありがとう

このソリューションで私を助けてくれた JIRA に関する詳細情報が必要な場合 (コメントを読んでください)

于 2012-10-09T12:40:17.790 に答える
0
class Post {

    def postService

    ...
} 

参照: http://grails.org/doc/2.1.0/guide/single.html#dependencyInjectionServices

于 2012-10-09T04:45:49.507 に答える