无法为类Enum Mybatis异常找到可用的构造函数

时间:2016-09-29 10:58:29

标签: java spring mybatis spring-mybatis

我正在尝试在spring mybatis中设置ENUM TypeHandlers,低于异常,

  

原因:org.apache.ibatis.type.TypeException:无法找到可用的   类的构造函数   com.citi.aw.data.ibatis.KnownTypeHandlers $ PortfolioTypeEnum

SqlConfig.xml

<configuration>
 <typeHandlers>
    <typeHandler javaType="com.citi.aw.entities.portfolio.PortfolioType" 
        handler="com.citi.aw.data.ibatis.KnownTypeHandlers$PortfolioTypeEnum"/></typeHandlers>
</configuration>

PortfolioType Enum

public enum PortfolioType
{
    PROPOSAL,
    INVESTABLE,
    MODEL,
    MODEL_STRATEGY,
    STRATEGY,
    CLIENT,
    FUND_OF_FUND,
    REFERENCE,
    MODEL_ALLOCATION    
}
Class KnownTypeHandlers
 public class KnownTypeHandlers 
    {
        public static abstract class PortfolioTypeEnum extends OrdinalEnumTypeHandler
        {
            public PortfolioTypeEnum()
            {
                super(PortfolioType.values());
            }
        }
}
Class OrdinalEnumTypeHandler

    public abstract class OrdinalEnumTypeHandler extends org.apache.ibatis.type.BaseTypeHandler<Object>
{
    private Object[] enumValues;

    protected OrdinalEnumTypeHandler(Object[] enumValues)
    {
        this.enumValues = enumValues;
    }

    @Override
    public Object getResult(ResultSet rs, String columnName) throws SQLException
    {
        int intValue = rs.getInt(columnName);
        return enumValues[intValue];
    }

    @Override
    public Object getResult(ResultSet rs, int columnPos) throws SQLException
    {
        int intValue = rs.getInt(columnPos);
        return enumValues[intValue];
    }

    @Override
    public Object getResult(CallableStatement arg0, int arg1) throws SQLException
    {
        throw new SQLException("not implemented");
    }

    @SuppressWarnings("unchecked")
    //@Override
    public void setParameter(PreparedStatement ps, int pos, Object parameter, String jdbcType) throws SQLException
    {
        ps.setInt(pos, ((Enum)parameter).ordinal());
    }

    //@Override
    public Object valueOf(String stringValue)
    {
        return enumValues[Integer.parseInt(stringValue)];
    }
}

1 个答案:

答案 0 :(得分:3)

我猜你正在使用MyBatis 3.所以,你不需要为枚举创建任何处理程序。 MyBatis有一个typehandler到Enum案例。

参考文档中的MyBatis 3 Configuration

  

<强>类型处理器

     

每当MyBatis在PreparedStatement上设置参数时   或从ResultSet中检索值,TypeHandler用于   以适合Java类型的方式检索值。该   下表描述了默认的TypeHandlers。

     

...

     

EnumTypeHandler - Enumeration Type - VARCHAR任何字符串兼容类型,因为代码存储(而不是索引)。

然后添加到您的配置xml(在您的情况下为SqlConfig.xml

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.apache.ibatis.type.EnumTypeHandler"/>
</typeHandlers>