OFBiz调试技巧禅与道

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日志信息最容易查找。它们的日志信息中通常有类名与行号生成:
111770[PaymentGatewayServices.java:776:INFO ] (Capture) Invoice [#10110] total: 38.54

Minilang方法日志中的类名均为Log.java,如:
112499[                Log.java:103:INFO ] Finished quickShipEntireOrder:\nshipmentShipGroupFacilityList=[[shipmentId=10120, facilityId=WebStoreWarehouse, shipGroupSeqId=00001]]\nsuccessMessageList=[Created shipment with ID [10120] for ship group ID [00001] for facility ID [WebStoreWarehouse]]


如果你在beanshell中直接使用输出,你输出的内容将显著的显示于日志文件中:
2006-07-19 13:46:26,373 [  ServiceDispatcher.java:450:DEBUG] [[Sync service finished- total:0.027,since last(Begin):0.027]] - 'ecommerce / getProductCategoryAndLimitedMembers'
parentCategory = TABLE-LINENS-SOLIDS 
2006-07-19 13:46:26,874 [      PriceServices.java:802:INFO ] PromoPrice and ProductPriceAction had null amount and no default price was available, using list price: 2.0 for product with id 15899

如果你在beanshell中使用调试方法,你将在日志中得到如下信息:
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中增加日志信息,只需要显示你打算跟踪的变量,如:
   ${invoice}  <#-- 将显示 invoice 的一般属性值-->
   ${invoice.invoiceId}  <#-- 将显示invoice.invoiceId属性值 -->


在minilang中增加日志信息,使用<log >指令并输入你的值,比如在freemarker中:
   ${invoice}  <#-- will display the entire GenericValue invoice -->
   ${invoice.invoiceId}  <#-- will display the invoiceId field of invoice -->


通常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文件后忘记再次编译它来使新增的方法生效。

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。

本文档译自ofbiz 4.0 cookbooks,本人翻译,欢迎转载,请注明出处.

你可能感兴趣的:(java,freemarker,xml,浏览器,XSL)