【发布时间】:2010-06-15 11:47:06
【问题描述】:
我想为 IBatis 创建一个通用的基于枚举的映射器。我正在使用以下代码执行此操作。这确实有编译时错误,我不知道如何修复。也许我的解决方案是完全错误的(请记住使用 IBatis),在这种情况下,请提出更好的建议。
任何帮助表示赞赏。
我想要实现的是将后续映射器定义为:
public class XEnumTypeHandler extends CommonEnumTypeHandler<X> {
}
当前代码:
public class CommonEnumTypeHandler<T extends Enum> implements TypeHandlerCallback {
public void setParameter(ParameterSetter ps, Object o) throws SQLException {
if (o.getClass().isAssignableFrom(**T**)) {
ps.setString(((**T**) o).value().toUpperCase());
} else
throw new SQLException("Excpected ParameterType object than: " + o);
}
public Object getResult(ResultGetter rs) throws SQLException {
Object o = valueOf(rs.getString());
if (o == null)
throw new SQLException("Unknown parameter type: " + rs.getString());
return o;
}
public Object valueOf(String s) {
for (T pt : T.**values()**) {
if (pt.**value()**.equalsIgnoreCase(s))
return pt;
}
return null;
}
}
我已经在上面的代码中添加了错误标记,错误信息是按顺序排列的:
- T 无法解析
- 方法 value() 未定义 T型
- 方法 values() 未定义 T型
- 方法 values() 未定义 T型
我已经用下面的代码解决了这个问题:
public class CommonEnumTypeHandler<T extends Enum> implements TypeHandlerCallback {
Class<T> clazz;
public CommonEnumTypeHandler(Class<T> clazz) {
this.clazz = clazz;
}
public void setParameter(ParameterSetter ps, Object o) throws SQLException {
if (o.getClass().isAssignableFrom(clazz)) {
ps.setString(((T) o).name().toUpperCase());
} else
throw new SQLException("Excpected " + clazz + " object than: " + o);
}
public Object getResult(ResultGetter rs) throws SQLException {
Object o = valueOf(rs.getString());
if (o == null)
throw new SQLException("Unknown parameter type: " + rs.getString());
return o;
}
public Object valueOf(String s) {
return Enum.valueOf(clazz, s);
}
}
我继承这个类:
public class SalesChannelTypeHandler extends CommonEnumTypeHandler<SalesChannel> {
public SalesChannelTypeHandler() {
super(SalesChannel.class);
}
public SalesChannelTypeHandler(Class<SalesChannel> clazz) {
super(clazz);
}
}
【问题讨论】:
-
请添加编译器错误和您实际尝试实现的一些描述