无法将数据库项映射到java枚举

无法将数据库项映射到java枚举,java,spring-mvc,enums,mybatis,Java,Spring Mvc,Enums,Mybatis,在Spring应用程序中使用mybatis(v3.1.1)从DB获取条目时,我遇到以下错误 它与字符串(用于在db中保存值)到枚举(用于映射)的映射有关 堆栈跟踪如下所示: List com.expertly.service.TransactionLogServiceImpl.getTransactionLogs(ActionType) threw org.apache.ibatis.exceptions.PersistenceException: ### Error querying

在Spring应用程序中使用mybatis(v3.1.1)从DB获取条目时,我遇到以下错误

它与字符串(用于在db中保存值)到枚举(用于映射)的映射有关

堆栈跟踪如下所示:

List com.expertly.service.TransactionLogServiceImpl.getTransactionLogs(ActionType) threw org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: java.lang.IllegalArgumentException: No enum const class com.expertly.common.model.reports.TransactionState.COMMITTED 
    ### The error may exist in com/expertly/data/mapper/TransactionLogMapper.java (best guess)
    ### The error may involve com.expertly.data.mapper.TransactionLogMapper.getTransactionLogs-Inline
    ### The error occurred while setting parameters
    ### SQL: SELECT id, transactionstate AS "transactionState", sessionid AS "userSession.sessionId" FROM transactionlog WHERE actioncode = 'VIEW_USER'

Caused by: java.lang.IllegalArgumentException: No enum const class com.expertly.common.model.reports.TransactionState.COMMITTED 
    at java.lang.Enum.valueOf(Enum.java:196) ~[na:1.6.0_38]
    at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:43) ~[mybatis-3.1.1.jar:3.1.1]
    at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:23) ~[mybatis-3.1.1.jar:3.1.1]
package com.expertly.common.model.reports;

import java.io.Serializable;

import com.google.gwt.user.client.rpc.IsSerializable;

public enum TransactionState implements Serializable, IsSerializable{
    STARTED("STARTED"),
    COMMITTED("COMMITTED"),
    FAILED("FAILED");

    private final String state;

    TransactionState(String state){
        this.state = state;
    }

    @Override
    public String toString(){
        return state;
    }
}
我的映射器功能:

@Select("SELECT id, transactionstate AS \"transactionState\", sessionid AS \"userSession.sessionId\" "+
    "FROM transactionlog WHERE actioncode = #{actionType} ")
List<TransactionLog> getTransactionLogs(@Param("actionType") ActionType actionType) throws TransactionLogMapperException;
ActionType枚举如下所示:

List com.expertly.service.TransactionLogServiceImpl.getTransactionLogs(ActionType) threw org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: java.lang.IllegalArgumentException: No enum const class com.expertly.common.model.reports.TransactionState.COMMITTED 
    ### The error may exist in com/expertly/data/mapper/TransactionLogMapper.java (best guess)
    ### The error may involve com.expertly.data.mapper.TransactionLogMapper.getTransactionLogs-Inline
    ### The error occurred while setting parameters
    ### SQL: SELECT id, transactionstate AS "transactionState", sessionid AS "userSession.sessionId" FROM transactionlog WHERE actioncode = 'VIEW_USER'

Caused by: java.lang.IllegalArgumentException: No enum const class com.expertly.common.model.reports.TransactionState.COMMITTED 
    at java.lang.Enum.valueOf(Enum.java:196) ~[na:1.6.0_38]
    at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:43) ~[mybatis-3.1.1.jar:3.1.1]
    at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:23) ~[mybatis-3.1.1.jar:3.1.1]
package com.expertly.common.model.reports;

import java.io.Serializable;

import com.google.gwt.user.client.rpc.IsSerializable;

public enum TransactionState implements Serializable, IsSerializable{
    STARTED("STARTED"),
    COMMITTED("COMMITTED"),
    FAILED("FAILED");

    private final String state;

    TransactionState(String state){
        this.state = state;
    }

    @Override
    public String toString(){
        return state;
    }
}

请告诉我出了什么问题,以及如何解决此问题。

请检查从DB获取的字符串中是否有空格。
这应该是唯一的差异,因为看不到任何打字错误。

TransactionState的枚举值是什么?@JohnB我已经更新了这个问题。仅供参考,您不需要将
状态
传递给
TransactionState
的构造函数,只需使用
toString
的默认实现即可。这将使用enum的
name()
,它与您的相同。如果你真的想,你可以做
this.state=name()。该错误似乎很奇怪,但您已重写
toString
,但仍然希望
valueOf
基于
字符串运行是有风险的。不要覆盖
toString
,这样会更加健壮。不知何故,这表明枚举的名称与其
状态
值之间存在拼写问题。