2022年OFBiz调试技巧 .pdf
1、如何调试 OFBiz 首先你需要学习和熟悉OFBiz的教程与工具指导文档。指导文档特别重要,因为很多子主题内容不是排列最前的内容却可能导致问题的发生。你应该熟悉类似于 Freemaker,beanshell,XML 这些技术。 你也应该有过处理那些与OFBiz无关问题的经验,比如处理数据库或服务器引起的问题。现在,你应该仔细查看日志文件了解你错误发生的原因。 OFBiz 在日志文件中提供大量的信息, 这些信息将有助于你了解你遇到的问题。它比处理的艺术更重要。哪些东西看上去工作有些特别,比如比如有些关联程序将导致或影响到的结果,你都可以在日志文件中找到。 如果你确实无法在日志文件中发现任何有用的东西,这时增加你自己的日志信息直到你有足够的信息来发现实际的问题所在。本指引将向你介绍OFBiz 的日志文件工作情况, 如何增加你自己的日志记录, 以及一些常见信息的含义。这些知识的理解建立在你理解JAVA及其它相关的技术基础上,所有问题的焦点只在于OFBiz 的概念与信息内容中。2. OFBiz 日志文件OFBiz创建较多日志文件并将它们存储于logs/ 目录 (在 opentaps-0.9或更早版本中)或 framework/logs/(在 opentaps-0.9之后版本),文件有:- ofbiz.log.? - 记录所有 OFBiz生成日志信息。此文件将在满时自动循环创建新文件, 即 ofbiz.log是当前日志文件,ofbiz.log.1是较早些时间的日志文件,ofbiz.log.2是比 ofbiz.log.1更早时间的日志文件,以此类推。- console.log - 记录所有 OFBiz在控制台界面运行显示的内容。 也有可能无效。- access_log.? - 类似于 Apache httpd 日志格式记录所有服务请求。很漂亮但对调试没有什么用处。大多数据时间, 你可以通过 ofbiz.log或 console.log来查询调试信息。 因为它们有很多内容,所以你最好使用一个可以翻页与进行查找的编辑器来打开这些日志文件。3、查找日志信息Java 日志信息最容易查找。它们的日志信息中通常有类名与行号生成:111770PaymentGatewayServices.java:776:INFO (Capture) Invoice #10110 total: 38.54 Minilang方法日志中的类名均为Log.java ,如: 如果你在 beanshell 中直接使用输出,你输出的内容将显著的显示于日志文件中:Java 代码1. 2006- 07- 19 13: 46: 26, 373 ServiceDispatcher.java:450:DEBUG Sync service finished- total:0.027 ,since last(Begin):0.027 - ecommerce / getProductCategoryAndLimitedMembers2. parentCategory = TABLE-LINENS-SOLIDS 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - 3. 2006- 07- 19 13: 46: 26, 874 PriceServices.java:802:INFO PromoPrice and ProductPriceAction had null amount and no defaultprice was available, using list price: 2.0 for product with id 15899如果你在 beanshell中使用调试方法,你将在日志中得到如下信息:Java 代码1. 2006- 07- 19 13: 46: 26, 373 ?:? parentCategory = TABLE-LINENS-SOLIDS 你可以为那些无法发现日志信息的minilang或 beanshell代码中加入自己的信息输出。所有 freemarker ,screen-widget或 form widget 输出的信息将直接显示在你的浏览器屏幕上。除非这些控件崩溃否则不会显示任何日志信息。4. 增加你自己的日志信息在 Java 中增加你自己的日志信息,请使用OFBiz Debug类(org.ofbiz.base.util.Debug)中的调试方法,如logInfo ,logWarning, logError. 示例: Debug.logInfo(Now processing invoice + invoiceId, module); 在 beanshell中增加日志信息, 同样使用 Debug方法,但在内容中忽略如 这样内容。在 freemarker中增加日志信息,只需要显示你打算跟踪的变量,如:Java 代码1. $invoice 2. $invoice.invoiceId 在 minilang中增加日志信息,使用 指令并输入你的值,比如在 freemarker中:Java 代码1. $invoice 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - 2. $invoice.invoiceId 通常 level节点属性用于设置日志级别,如:info, warning, error,对应于 Debug中的同名方法。5. 何时需要重启 OFBiz 你在做如下更改时需要重新启动OFBiz 服务器:- Java 文件(记得要重新编译)- 配置/.properties文件- entitymodel或 entitygroup XML定义文件- 服务或 secas XML文件- JPublish XML文件你在进行以下修改时无需重新启动OFBiz 服务器:- freemarker FTL模版- beanshell BSH模版- Screens XML 文件- Forms XML 文件- 控制器 XML文件(注意:在 opentaps-0.8和 OFBiz 3.x 及更早版本中,你在更改控制器时需要重启)但有可能你需要在浏览器中清除缓存。6. 常见错误及其含义:Cannot locate service by name (captureBillingAccountPayment) * 此服务 (captureBillingAccountPayment) 在所有 services.xml 定义中都找不到 . Cannot find service location (org.ofbiz.order.order.OrderServices) * 说明在 services XML 定义点上指向的资源不存在. 如果这是一个minilang或 beanshell 服务,即服务引擎无法找到此文件。如果这是一个Java服务,则说明在 classpath中无法查找到这个类。Service method does not exist (com.opensourcestrategies.financials.invoice.InvoiceServices.setInvoiceDueDate(org.ofbiz.service.DispatchContext, java.util.Map) * 含义是在某个 services.xml指定的这个服务不存在对应的Java 方法。通常发生于你在修改了Java 文件后忘记再次编译它来使新增的方法生效。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - java.lang.IllegalArgumentException: Could not get next sequenced ID for sequence name: Party (Could not get next sequenced ID for sequence name: Party). * 系统无法取得实体的下一个自动ID,通常发生于数据库断开情况。ERROR: insert or update on table inventory_item violates foreign key constraint inv_item_facility * 在inventory_item表的插入 / 修改操作时违犯 inv_item_facility外键约束。Error calling event: org.ofbiz.webapp.event.EventHandlerException: Service invocation error (Commit transaction failed) * 这是一个非常令人讨厌的错误信息。通常它意味着你访问的服务所触发的ECA链服务中有一个服务失败,于是导致全部的操作失败。服务引擎无法为你进一步跟 踪,所以你需要进入log 文件中进一步查找错误原因。访问你的logs/ofbiz.log 或 logs/console.log文件去了解触发错误的根本原因。Unable to bind UserTransaction/TransactionManager to JNDI * 这是在 opentaps 0.8/0.9及 OFBiz 的 pre-Geronimo 版本在 Linux 系统下可能会发生的一个问题 . 解决方法可以在以下网址中找到: http:/lists.ofbiz.org/pipermail/users/2004-June/004094.html Message: The entity name must immediately follow the & in the entity reference. org.xml.sax.SAXParseException: The entity name must immediately follow the & in the entity reference. * 这是一个 XSL:FO 错误并意味着你在文本中使了字符& , 比如说你在描述或地址中使了这个字符。 XSL:FO 使用 xml 属性格式,所以你需要确认你在文本字段后放置 ?xml。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -