【问题标题】:Set values from src/groovy classes to domain class properties将 src/groovy 类中的值设置为域类属性
【发布时间】:2014-08-20 23:43:33
【问题描述】:

我正在使用 groovy 和 grails 开发 crawler4j。​​

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

BasicCrawler.groovy 类中的属性很少,例如 urlparentUrldomain 等。 p>

我想通过在爬行时将这些值传递给域类来将这些值保存到数据库中。

我尝试在 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 类中,我在顶部声明了 urlparentUrl 属性,然后使用了数据绑定(我可能是错的,因为我只是一个初学者):

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 作为后端。

【问题讨论】:

  • 您可以在各个代码位置临时添加一些log.debug()println,看看代码在哪里有效,哪里无效。
  • 您能否在您的第一种方法中发布异常的行号。您尝试的第二种方法的实现有点错误,即在创建 BasicCrawler 的新实例时立即绑定参数,因此 url && parentUrl 将始终为空。因此,在您的 visit 方法执行后将其更改为绑定。

标签: grails groovy dns setting crawler4j


【解决方案1】:

我认为这个例子有点做作,但在当前情况下,你可以通过以下方法解决这个问题:

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 来“重新获取”和更新“访问”的原始站点,因为我假设这将是每一行的唯一约束。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多