2

これは長い質問であり、私が解決したいと思っている奇妙な問題です。クライアントがJSONオブジェクトをサーバーに投稿します。レポートを保存し、別の目的で生成されたIDをjmsで使用しますが、追加が成功したときにnullIDを取得することがあります。どうすればこれを防ぐことができますか?

私のドメインでは

int id
String reportImage
Date reportDateTime;
static constraints = {
    id(blank:false, unique:true) 
    reportImage (blank:true, nullable:true)
    reportDateTime (blank:false)
}
def afterInsert = {

    id= this.id

} 

私のコントローラーには、

JSONObject json = request.JSON        
AddReportService svc = new AddReportService()        
def id= svc.addReport(json)
json.put("id",id)
jmsService.send(queue:'msg.new', json.toString())

私のレポート追加サービスでは、

JSONObject obj = report
Reports reports = new Reports()
       ...
reports.save(flush:true)
myid = reports.id
return myid

私のjmsでは、

def jmsService
static transactional = false
static exposes = ['jms']


@Queue(name='msg.new')    
def createMessage(msg) {
    JSONObject json = new JSONObject(msg)
    int id = json.get("id") // sometimes is null, but report was added. How to prevent?


    AlertManagement am = new AlertManagement()
    am.IsToSendAlert(id)
4

2 に答える 2

4

挿入後にidがnullの場合、それはほぼ確実に挿入が何らかの方法で失敗したことを意味します。を呼び出すときは、戻り値にreports.save()追加failOnError: trueするか、戻り値を調べる必要があります。

コードに関するいくつかのコメント:

  • ドメインオブジェクトでidプロパティを宣言する必要はありません。grailsは暗黙的に(タイプのlong)idプロパティを追加します。
  • 同様に、id制約は冗長です。
  • id = this.idハンドラーでの割り当てafterInsertは何も行わず、不要です。GORMは、挿入後にドメインオブジェクトIDが正しく設定されていることを確認します。

また、オブジェクトがgrailsに永続化される方法とタイミングは、特に手動のフラッシュとトランザクションを追加する場合は、必ずしも簡単ではありません。これは、理解を深めるために必読です:http: //blog.springsource.com/2010/06/23/gorm-gotchas-part-1/

于 2012-06-20T14:41:29.877 に答える
0

idプロパティを上書きしようとしています。通常、Groovyドメインクラスにはデフォルトのidプロパティがあります。したがって、idプロパティを定義する必要はありません。ドメインクラスで定義せずにidプロパティにアクセスできます。

ドメインクラス

class A {
    String reportImage
    Date reportDateTime

}

サービスクラスで

def instance=new A("xxx",new Date())
if(instance.save())
{
    return instance.id
}
于 2016-04-27T13:44:39.547 に答える