2

这是一个很长的问题和我希望解决的奇怪问题。我的客户将一个 JSON 对象发布到我的服务器。我保存报告并在我的 jms 中使用为其他目的生成的 id,但是当我的添加成功时有时会得到空 id。我怎样才能防止这种情况?

在我的域中

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 为空,则几乎可以肯定意味着插入以某种方式失败。当您调用 时reports.save(),您应该添加failOnError: true或检查返回值。

对您的代码的一些评论:

  • 您不需要在域对象中声明 id 属性,grails 会隐式添加一个(类型long)。
  • 同样,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 回答