无法将数据库项映射到java枚举
在Spring应用程序中使用mybatis(v3.1.1)从DB获取条目时,我遇到以下错误 它与字符串(用于在db中保存值)到枚举(用于映射)的映射有关 堆栈跟踪如下所示:无法将数据库项映射到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
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()构造函数中的code>。该错误似乎很奇怪,但您已重写toString
,但仍然希望valueOf
基于字符串运行是有风险的。不要覆盖toString
,这样会更加健壮。不知何故,这表明枚举的名称与其状态
值之间存在拼写问题。