在启动时查询注册表时发生ComponentLookupError

如何解决在启动时查询注册表时发生ComponentLookupError

|| 我正在构建一个应用程序,该应用程序使用Collective.lead(树干)查询外部关系数据库中的某些数据。用户可以在自定义的Plone控制面板工具中修改数据库连接设置(我遵循了Aspeli \'s Professional Plone Development一书中的示例)。以这种方式查询数据库设置。 我产品的基本configure.zcml设置了数据库实用程序:
<include package=\"plone.app.registry\" />
<include package=\"collective.lead\" />

<i18n:registerTranslations directory=\"locales\" />

<utility
  provides=\"collective.lead.interfaces.IDatabase\"
  factory=\".dbsettings.CalculatorDatabase\"
  name=\"test.calc.db\"
  />
dbsettings.py具有:
from zope.component import getUtility
from plone.registry.interfaces import IRegistry

class CalculatorDatabase(Database):

    @property
    def _url(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(IDatabaseSettings)
        return URL(
            drivername=settings.drivername,username=settings.username,password=settings.password,host=settings.hostname,port=settings.port,database=settings.database,)
这在运行时引发ComponentLookupError异常:
File \"/home/zope/envs/test-web/src/test.calc/test/calc/dbsettings.py\",line 38,in _url
    registry = getUtility(IRegistry)
File \"/home/zope/envs/test-web/eggs/zope.component-3.7.1-py2.6.egg/zope/component/_api.py\",line 171,in getUtility
    raise ComponentLookupError(interface,name)
zope.configuration.config.ConfigurationExecutionError: <class \'zope.component.interfaces.ComponentLookupError\'>: (<InterfaceClass plone.registry.interfaces.IRegistry>,\'\')
in:
File \"/home/zope/envs/test-web/src/test.calc/test/calc/configure.zcml\",line 26.2-30.6
<utility
  provides=\"collective.lead.interfaces.IDatabase\"
  factory=\".dbsettings.CalculatorDatabase\"
  name=\"test.calc.db\"
  />
为什么在运行时找不到注册表?我究竟做错了什么? 谢谢。     

解决方法

        史蒂夫提到的是问题的根源,因此,我将仅针对无法执行异常处理的情况添加解决方法。在类似的情况下,我需要注册一个实用程序,该实用程序取决于存储在注册表中的设置。没有这些设置便无法注册该实用程序,因此我绝对希望事情能够按顺序进行。 解决方法是不在zcml中注册实用程序,而是在以下订户中进行注册:
<subscriber
    for=\"Products.CMFPlone.interfaces.IPloneSiteRoot
         zope.app.publication.interfaces.IBeforeTraverseEvent\"
    handler=\".component.setupStuff\"
    />
这样可以保证“ 4”可以访问所有本地公用程序。还要注意,“ 4”在查询该实用程序是否已存在之后也会迅速返回,因为订户将在每个请求上触发。     ,        Collective.lead已被http://pypi.python.org/pypi/z3c.saconfig取代,它允许您在zcml中定义数据库连接。如果需要控制面板来配置连接,可以将其与http://pypi.python.org/pypi/collective.saconnect一起使用。     ,        注册表是本地组件。每个Plone站点(数据库中可能有很多站点)都有自己的站点。因此,它取决于上下文。 Zope在遍历(URL与对象的连接)过程中找出该上下文。这(几乎)意味着您只能在请求的上下文中查找注册表。因此,您无法在启动代码中查找注册表。 这可能导致编写代码的麻烦。一种解决方案是将查找嵌入try / except中,如果您还没有遍历上下文,那么它将优雅地处理查找异常。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?