米巴蒂斯。java.lang.UnsupportedOperationException
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16534205/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
mybatis. java.lang.UnsupportedOperationException
提问by GoodwillDD
Why an error occurs in this code? I don't understand.. Help me please.
为什么这段代码会出错?我不明白。。请帮帮我。
I've tested it: doSave()
, getListCount()
, doDelete()
, getDetails()
are good.
我测试过它:doSave()
,getListCount()
,doDelete()
,getDetails()
都不错。
But, in getList()
method an error occurs!
但是,在getList()
方法中发生错误!
Why? That method has no parameters, only one query.
为什么?该方法没有参数,只有一个查询。
select * from tb_board_data
my config : mybatis 3.2.2 / mybatis-spring 1.2.0 / spring 3.2.2
我的配置:mybatis 3.2.2 / mybatis-spring 1.2.0 / spring 3.2.2
package kr.co.goodwilldd.board.mapper;
import java.util.ArrayList;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectKey;
import org.apache.ibatis.mapping.StatementType;
import org.springframework.stereotype.Repository;
@Repository
public interface CommonBoardMapper<T> {
@Select(value = "SELECT COUNT(*) FROM TB_BOARD_DATA")
public long getListCount();
@Select(value = "SELECT * FROM TB_BOARD_DATA")
public ArrayList<T> getList();
@Select(value = "SELECT * FROM TB_BOARD_DATA WHERE bseq = #{_seq}")
public T getDetails(long _seq);
@SelectKey(before=true, keyProperty="bseq", statementType=StatementType.PREPARED, statement="SELECT (IFNULL(MAX(BSEQ),0)+1) as bseq FROM TB_BOARD_DATA", resultType=Long.class)
@Insert(value = "INSERT INTO TB_BOARD_DATA(bseq, boardName, register, subject, content, reStep, reLevel, regdate) SELECT #{bseq}, #{boardName}, #{register}, #{subject}, #{content}, ifnull(((floor(max(reStep)/100))+1)*100+99, 199) , 0, CURRENT_DATE() FROM TB_BOARD_DATA")
public int doSave(T t);
@Delete(value = "DELETE FROM TB_BOARD_DATA WHERE bseq = #{_seq}")
public int doDelete(long _seq);
}
Error logs here:
错误日志在这里:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.UnsupportedOperationException
### The error may exist in kr/co/goodwilldd/board/mapper/CommonBoardMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT * FROM TB_BOARD_DATA
### Cause: java.lang.UnsupportedOperationException
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364)
at com.sun.proxy.$Proxy13.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:114)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
at com.sun.proxy.$Proxy25.getList(Unknown Source)
at kr.co.goodwilldd.board.CommonBoardTest.getListByMapper(CommonBoardTest.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.accessList<Customer> getList();
0(ParentRunner.java:42)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.UnsupportedOperationException
### The error may exist in kr/co/goodwilldd/board/mapper/CommonBoardMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT * FROM TB_BOARD_DATA
### Cause: java.lang.UnsupportedOperationException
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:354)
... 36 more
Caused by: java.lang.UnsupportedOperationException
at org.apache.ibatis.reflection.wrapper.CollectionWrapper.findProperty(CollectionWrapper.java:42)
at org.apache.ibatis.reflection.MetaObject.findProperty(MetaObject.java:76)
at org.apache.ibatis.executor.resultset.FastResultSetHandler.applyAutomaticMappings(FastResultSetHandler.java:342)
at org.apache.ibatis.executor.resultset.FastResultSetHandler.getRowValue(FastResultSetHandler.java:267)
at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleRowValues(FastResultSetHandler.java:216)
at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSet(FastResultSetHandler.java:188)
at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSets(FastResultSetHandler.java:154)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:57)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)
at org.apache.ibatis.executor.ReuseExecutor.doQuery(ReuseExecutor.java:54)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:259)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:132)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
... 42 more
回答by duanjfeng
You should specify a concrete type as the return type, like
您应该指定一个具体类型作为返回类型,例如
List<T> getList();
, but no generic type
, 但没有泛型类型
List getList();
or
或者
@Select(value = "SELECT * FROM TB_BOARD_DATA")
public List<T> getList();
Cause if you specify the type, mybatis will use BeanWrapper convert each row to the type. But if there are no specific type, mybatis will treat each row as a List and use CollectionWrapper, which findProperty is not supported.
因为如果指定类型,mybatis 会使用 BeanWrapper 将每一行转换为类型。但是如果没有特定的类型,mybatis 会把每一行当成一个List,使用CollectionWrapper,不支持findProperty。
回答by user3262100
try this:
试试这个:
@Select(value = "SELECT * FROM TB_BOARD_DATA")
public List<T> getList();
回答by Om.
Always follow code for interface :)
始终遵循接口代码:)
Either use Generic
要么使用通用
@Select(value = "SELECT * FROM TB_BOARD_DATA")
public List<String> getList();
Or Non Generic
或非通用
getList(Unknown Source)
回答by Mukesh
If you see the OOPS design principles which says that always "Programming for Interface not implementation" .We should follow that practice it will avoid many undesired exceptions.
如果您看到 OOPS 设计原则,它总是说“为接口编程而不是实现”。我们应该遵循这种做法,它将避免许多不需要的异常。
回答by javalearner_heaven
Your error is
你的错误是
##代码##Please provide the same return type while calling the method also.
List
means List or ArrayList
means ArrayList
请在调用该方法时也提供相同的返回类型。
List
表示 List 或ArrayList
表示 ArrayList
回答by Gangnus
I had the same error when:
我在以下情况下遇到了同样的错误:
- In the XML mapper the Oracle expression got
String
value asCHAR(table.coltime, 'DD.MM.YYYY')
- My return type got
java.sql.Date
instead.
- 在 XML 映射器中,Oracle 表达式的
String
值为CHAR(table.coltime, 'DD.MM.YYYY')
- 我的返回类型
java.sql.Date
改为。
The repair removed the error.
修复消除了错误。
So, the error can appear as a result of unfitting field types in the return object.
因此,错误可能是由于返回对象中的字段类型不合适而出现的。