ADF自定义错误消息

你可以在ADF Business Components内部定义任何错误消息。

这里阐述两种自定义错误消息:ADFBC错误消息、数据库约束错误消息。

 

一、定制ADFBC错误消息

 

ADFBC错误消息一般以Jbo开头,默认格式为:

{productCode}-{errorCode}: {messageBody}

 

如:

JBO-25013 TooManyException

更多JBO异常,请参照oracle.jbo.CSMessageBundle

 

介绍一下JboException的一个构造方法及用法

JboException(java.lang.Class resBundleClass, java.lang.String errorCode, java.lang.Object[] params)

 

resBundleClass - ResourceBundle的子类提供消息文本。

errorCode - Resource bundle中和消息关联的错误代码。

params - 错误消息的参数。

 

如:

 

Resource bundle

[java]  view plain copy
  1. import oracle.jbo.common.util.CheckedListResourceBundle;  
  2.   public class MyMsgBundle extends CheckedListResourceBundle  
  3.   // String Constants  
  4.      public static final String BAD_EMPNO = "101";  
  5.     public static final String DEPT_NOT_FOUND = "102";  
  6.       public static final String NOT_IN_DEPT = "103";  
  7.        ...  
  8.  //Private 2-D array of key-value pairs  
  9.    private static final Object[][] sMessageStrings = {  
  10.    ...  
  11.    { BAD_EMPNO, "Invalid employee number." },  
  12.    { DEPT_NOT_FOUND, "Department {0} does not exist." }  
  13.    { NOT_IN_DEPT, "Employee {0} not found in Department {1}." }  
  14.    ...  
  15.   }  
  16. }  


抛定制异常

[java]  view plain copy
  1. throw new JboException(MyMsgBundle.class           // Class of Bundle  
  2.                         MyMsgBundle.DEPT_NOT_FOUND  // String Constant  
  3.                         new Object[1] { localVar1 } //Arguments to message  
  4.    );  


步骤:

1.创建定制消息束文件

a.双击工程,进入Project properies

b.Project properties对话框选择 Business Components > Options

 Custom Message Bundles to use in this Project出现在对话框的底部

c.选择New创建Message Bundle Class

d.创建成功后显示如下

 

 

2. Message Bundle文件中定制消息

此处定制一个JBO-25013异常消息,代码如下:

[java]  view plain copy
  1. package model;  
  2.   
  3.    
  4.   
  5. import java.util.ListResourceBundle;  
  6.   
  7. public class MessageBundle extends ListResourceBundle {  
  8.   
  9.     private static final Object[][] sMessageStrings = new String[][]  
  10.   
  11.         {{"25013""Too many objects !"}};  
  12.   
  13.    
  14.   
  15.     /**Return String Identifiers and corresponding Messages in a two-dimensional array. 
  16.  
  17.      */  
  18.   
  19.     protected Object[][] getContents() {  
  20.   
  21.         return sMessageStrings;  
  22.   
  23.     }  
  24.   
  25. }  
  26.    

当出现JBO-25013错误时,系统会提示"Too many objects !"

 

3.运行结果

 

 

二、定制数据库约束消息

 

默认ADFBC是不提供捕获数据库端的约束信息,数据库的约束消息都统一为JBO-26048,在消息束文件中定制26048消息是不起作用的,并且数据库约束消息种类繁多,也不便于直接给26048定制消息。通过自定义的DatabaseTransactionFactory解决这一问题。以下为操作步骤:

1.在MessageBundle 中的sMessageStrings 数组中加上以下内容:

{"SALE_INDEX", "索引验证:记录{0}已经存在!"}

 

注:SALE_INDEX为数据库中表的索引,用来确保记录的唯一性。{0}为参数,在JboException构造方法中放入的参数将会填充此处。参数值为数组的第一个,{1}{2}...以此类推。

 

 

2.创建自定义Database Transaction Framework Extension Class

[java]  view plain copy
  1. package model;  
  2.   
  3.    
  4.   
  5. import oracle.jbo.CSMessageBundle;  
  6.   
  7. import oracle.jbo.DMLConstraintException;  
  8.   
  9. import oracle.jbo.JboException;  
  10.   
  11. import oracle.jbo.Row;  
  12.   
  13. import oracle.jbo.server.DBTransactionImpl2;  
  14.   
  15. import oracle.jbo.server.TransactionEvent;  
  16.   
  17.    
  18.   
  19. public class CustomDBTransactionImpl extends DBTransactionImpl2 {  
  20.   
  21.     public CustomDBTransactionImpl() {  
  22.   
  23.         super();  
  24.   
  25.         System.out.println("instanced CustomDBTransactionImpl .....");  
  26.   
  27.     }  
  28.   
  29.    
  30.   
  31.     @Override  
  32.   
  33.     protected void postChanges(TransactionEvent transactionEvent) {  
  34.   
  35.         try {  
  36.   
  37.             super.postChanges(transactionEvent);  
  38.   
  39.         } catch (DMLConstraintException e) {  
  40.   
  41.             Row row = e.getEntityRow();  
  42.   
  43.             e.setExceptions(null);  
  44.   
  45.             String errorCode = e.getErrorCode();  
  46.   
  47.             // String lmsg = e.getLocalizedMessage();  
  48.   
  49.             // jbo-26048   
  50.   
  51.             // A constraint violation occurred in the database while posting (writing) an entity to the database  
  52.   
  53.             if (CSMessageBundle.EXC_DML_POST_ENTITY_CONSTRAINT_VIOLATION.equals(errorCode)) {  
  54.   
  55.                 throw new JboException(MessageBundle.class, e.getConstraintName(),  
  56.   
  57.                                      new Object[] { row.toString() });  
  58.   
  59.             } else {  
  60.   
  61.                throw e;  
  62.   
  63.             }  
  64.   
  65.               
  66.   
  67.         }  
  68.   
  69.     }  
  70.   
  71. }  
  72.    

 

说明:DMLConstraintException 是继承JboException的一个类,负责抛出的约束异常,DMLConstraintException 的方法getConstraintName()用来获取约束名称。DMLConstraintException中还可以直接获取到再Message Bundle中定制的 文本信息,通过getLocalizedMessage()方法获取。另外DMLConstraintException对象还可以得到当前抛出异常时的EntityRow通过getEntityRow()方法获取,这里我通过重新EntityImpltoString()方法,将错误更准确的信息传到Message Bundle中定义的SALE_INDEX的消息文本中的参数{0}

 

3.创建Database Transaction Factory Class

[java]  view plain copy
  1. package model;  
  2.   
  3.    
  4.   
  5. import oracle.jbo.server.DBTransactionImpl2;  
  6.   
  7. import oracle.jbo.server.DatabaseTransactionFactory;  
  8.   
  9.    
  10.   
  11. /** 
  12.  
  13.  * @author King Yin 
  14.  
  15.  */  
  16.   
  17. public class CustomDBTransactionFactoryImpl extends DatabaseTransactionFactory {  
  18.   
  19.     public CustomDBTransactionFactoryImpl() {  
  20.   
  21.         super();  
  22.   
  23.     }  
  24.   
  25.    
  26.   
  27.     @Override  
  28.   
  29.     public DBTransactionImpl2 create() {  
  30.   
  31.         return new CustomDBTransactionImpl();  
  32.   
  33.     }  
  34.   
  35. }  


4.Application Module中配置Database Transaction Factory Class

 

4.运行结果

 

转自:http://blog.csdn.net/ygj26/article/details/6902770

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值