针对“数据库表输入”的指定字段类型扩展,需实现接口:
com.apusic.esb.das.extension.ColumnOverrideExtension
该接口如下:
import java.lang.reflect.Method;
public interface ColumnOverrideExtension {
/** ResultSet类名 */
static final String CLASS_RESULT_SET = "java.sql.ResultSet";
/**
* 获取用户指定的类型,可根据不同<code>columnName</code>返回不同的类型,如果指定了类型,须在返回前将传入的<code>context</code>的<code>overridden</code>属性设置为
* <code>true</code>。
*
* @param context 上下文信息,目前主要为是否被用户重写<code>overridden</code>属性
* @param colunmName 列属性名
* @param oldType 原数据库中的类型
* @throws 如果传入的<code>context</code>为<code>null</code>,则抛出<code>NullPointerException</code>异常
* @return 用户指定的类型。
*/
int getDesignatedType(COContext context, final String columnName, final int oldType);
/**
* 获取用户指定Result Set的读取方法,可根据不同<code>columnName</code>返回不同的读取方法,如果指定了读取方法,须在返回前将传入的<code>context</code>的
* <code>overridden</code>属性设置为<code>true</code>。
*
* @param context 上下文信息,目前主要为是否被用户重写<code>overridden</code>属性
* @param colunmName 列属性名
* @param oldType 原数据库中的类型
* @param newType 用户指定的新类型
* @throws 如果传入的<code>context</code>为<code>null</code>,则抛出<code>NullPointerException</code>异常
* @return 用户指定Result Set的读取方法,如果用户未指定,则返回null,系统将采用原来的读取方法。
*/
Method getDesignatedResultSetMothod(COContext context, final String columnName, final int oldType, final int newType);
/**
* 获取用户指定类型的数据,可根据不同<code>columnName</code>返回不同的指定类型数据,如果指定了类型数据,须在返回前将传入的<code>context</code>的
* <code>overridden</code>属性设置为<code>true</code>。
*
* @param context 上下文信息,目前主要为是否被用户重写<code>overridden</code>属性
* @param srcData 原数据库中的数据
* @param colunmName 列属性名
* @param oldType 原数据库中的类型
* @param newType 用户指定的新类型
* @throws 如果传入的<code>context</code>为<code>null</code>,则抛出<code>NullPointerException</code>异常
* @return 用户指定类型的数据,如果用户未指定,则返回原数据库中的数据。
*/
Object getDesignatedData(COContext context,
final Object srcData,
final String columnName,
final int oldType,
final int newType);
}其中COContext中包含如下信息:
/** 是否被用户重写*/
private boolean overridden;
public boolean isOverridden() {
return overridden;
}
public void setOverridden(boolean overridden) {
this.overridden = overridden;
}接下来,我们来实现这个扩展。
1.将数据库中的“SEX”字段取出,由“VARCHAR”类型改为“VARBINARY”类型,通过getDesignatedData()方法将数据库取出的数据转换为二进制类型的数据。修改字段类型后,应将COContext的overridden设置为true。
2.将数据库中的“CREATETIME”字段取出,由“DATE”类型改为“TIMESTAMP”类型,通过getDesignatedResultSetMothod()方法指定从数据库中通过“getTimestamp(int columnIndex)”方法读取数据。修改字段类型后,应将COContext的overridden设置为true。
package com.apusic.esb.das.extension.COColumnOverrideExtensionImpl
import java.lang.reflect.Method;
import java.sql.Types;
public class COColumnOverrideExtensionImpl implements ColumnOverrideExtension {
public int getDesignatedType(COContext context, final String columnName, final int oldType) {
if (context == null) {
throw new NullPointerException();
}
if ("SEX".equals(columnName)) {
context.setOverridden(true);
return Types.VARBINARY;
}
if ("CREATETIME".equals(columnName)){
context.setOverridden(true);
return Types.TIMESTAMP;
}
return Integer.MIN_VALUE;
}
public Method getDesignatedResultSetMothod(COContext context, String columnName, int oldType, int newType) {
if (context == null) {
throw new NullPointerException();
}
Class<?> clazz = null;
try {
clazz = Class.forName(ColumnOverrideExtension.CLASS_RESULT_SET);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if ("CREATETIME".equals(columnName)){
context.setOverridden(true);
try {
return clazz.getMethod("getTimestamp", int.class);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return null;
}
public Object getDesignatedData(COContext context,
final Object srcData,
final String columnName,
final int oldType,
final int newType) {
if (context == null) {
throw new NullPointerException();
}
Object designatedData = srcData;
if ("SEX".equals(columnName)) {
designatedData = ((String) srcData).getBytes();
context.setOverridden(true);
}
return designatedData;
}
}集成用户指定字段类型分三步:
1.配置用户自定义的策略:将接口的扩展实现类打成jar包,并在此jar包中的META-INF/services下新建文件名为com.apusic.esb.das.extension.ColumnOverrideExtension,如下图所示:
2.打开文件com.apusic.esb.das.extension.ColumnOverrideExtension, 插入如下图所示的内容:
内容为用户实现类的完整类型,并指定表名tableName(这里的表名指的是在“表输入”组件中自定义的表名,严格区分大小写)。
3.将该jar包部署在需要进行扩展的AESB节点的lib目录下。