将src / groovy类中的值设置为域类属性

时间:2014-06-30 14:49:23

标签: grails groovy dns setting crawler4j

我正在使用groovy和grails来处理crawler4j。​​

我在src / groovy中有一个 BasicCrawler.groovy 类,域类 Crawler.groovy 和一个名为 CrawlerController.groovy 的控制器。

我在 BasicCrawler.groovy 类中有一些属性,例如 url parentUrl domain 等。

我希望在抓取过程中将这些值传递给域类,从而将这些值持久化到数据库中。

我尝试在src / groovy下的 BasicCrawler 类中执行此操作

class BasicCrawler extends WebCrawler {
   Crawler obj = new Crawler()
   //crawling code 
   @Override
   void visit(Page page) {
      //crawling code
      obj.url = page.getWebURL().getURL()
      obj.parentUrl = page.getWebURL().getParentUrl()
   }

   @Override
   protected void handlePageStatusCode(WebURL webUrl, int statusCode, String   statusDescription) {
      //crawling code
      obj.httpstatus = "not found"
   }
}

我的域类如下:

class Crawler extends BasicCrawler {
   String url
   String parentUrl
   String httpstatus
   static constraints = {}
}

但是我收到了以下错误:

ERROR crawler.WebCrawler  - Exception while running the visit method. Message: 'No such property: url for class: mypackage.BasicCrawler
Possible solutions: obj' at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)

在此之后我尝试了另一种方法。在我的src / groovy / BasicCrawler.groovy类中,我在顶部声明了 url parentUrl 属性,然后使用了数据绑定(我可能错了,因为我只是一个初学者):

class BasicCrawler extends WebCrawler {
   String url
   String parentUrl

   @Override
   boolean shouldVisit(WebURL url) { //code
   }

   @Override
   void visit(Page page) { //code
   }

   @Override
   protected void handlePageStatusCode(WebURL webUrl, int statusCode, String statusDescription) {
      //code}
   }
   def bindingMap = [url: url , parentUrl: parentUrl]
   def Crawler = new Crawler(bindingMap)
}

我的 Crawler.groovy 域类如下:

class Crawler {
   String url
   String parentUrl
   static constraints = {}
}

现在,它没有显示任何错误,但值没有在数据库中持久存在。我正在使用mongodb作为后端。

1 个答案:

答案 0 :(得分:0)

我认为这个例子有点做作,但在目前的情况下你可以解决这个问题:

class BasicCrawler extends WebCrawler {
   @Override
   void visit(Page page) {
      Crawler obj = new Crawler()
      obj.url = page.getWebURL().getURL()
      obj.parentUrl = page.getWebURL().getParentUrl()
      obj.save()
   }

   @Override
   protected void handlePageStatusCode(WebURL webUrl, int statusCode, String   statusDescription) {
      Crawler obj = Crawler.findByUrl(webUrl)
      obj.httpstatus = "not found"
      obj.save()
   }
}

这里的关键是不使用成员实例变量并使用URL来“重新获取”#39;并更新原始网站'访问了'因为我假设这将是每一行的唯一约束。