Я получаю NPE в классе MyBatis BaseExecutor. Я предполагаю, что это что-то, что я делаю неправильно, но я не знаю, что это будет. Я использую mybatis 3.5.2
Фрагмент кода для BaseExecutor для удобства: трассировка стека:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.NullPointerException
### The error may exist in com/mycompany/salesconnect/screport/mapper/hubportfolio/datatable/OwnerDashboard.xml
### The error may involve com.mycompany.salesconnect.screport.mapper.hubportfolio.datatable.OwnerDashboard.getTotalHubPagesDataTableRowCount
### The error occurred while executing a query
### Cause: java.lang.NullPointerException
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.5.2.jar:3.5.2]
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) ~[mybatis-3.5.2.jar:3.5.2]
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) ~[mybatis-3.5.2.jar:3.5.2]
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76) ~[mybatis-3.5.2.jar:3.5.2]
at com.mycompany.salesconnect.screport.dao.SCHubOwnerDashboardServiceDaoImpl.getOwnerTotalHubPagesDataTableRowCount(SCHubOwnerDashboardServiceDaoImpl.java:76) ~[classes/:?]
at com.mycompany.salesconnect.screport.dao.SCHubOwnerDashboardServiceHandler$OwnerTotalHubPagesDataTableService.getDataTableRecordCount(SCHubOwnerDashboardServiceHandler.java:212) ~[classes/:?]
at com.mycompany.salesconnect.util.DataTableSpreadsheetBuilderRunnable.run(DataTableSpreadsheetBuilderRunnable.java:366) [classes/:?]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Caused by: java.lang.NullPointerException
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326) ~[mybatis-3.5.2.jar:3.5.2]
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) ~[mybatis-3.5.2.jar:3.5.2]
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:103) ~[mybatis-3.5.2.jar:3.5.2]
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) ~[mybatis-3.5.2.jar:3.5.2]
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.2.jar:3.5.2]
... 6 more
Фрагмент BaseExecutor для удобства
private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
List<E> list;
localCache.putObject(key, EXECUTION_PLACEHOLDER);
try {
list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
} finally {
localCache.removeObject(key); // This is line 326
}
localCache.putObject(key, list);
if (ms.getStatementType() == StatementType.CALLABLE) {
localOutputParameterCache.putObject(key, parameter);
}
return list;
}
Я попытался повернуть отключение кэширования для быстрого теста, но это не имеет значения.
Это файл сопоставления:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mycompany.myproduct.screport.mapper.hubportfolio.datatable.OwnerDashboard">
<cache/>
<resultMap id="OwnerTotalHubPagesDataTableRow"
autoMapping="false"
type="com.mycompany.myproduct.screport.model.OwnerTotalHubPagesDataTableRow">
<result property="hubId" column="hubId"/>
<result property="hubName" column="hubName"/>
<result property="pageId" column="pageId"/>
<result property="pageTitle" column="pageTitle"/>
<result property="description" column="description"/>
<result property="entitlement" column="entitlement"/>
<result property="customEntitlement" column="customEntitlement"/>
<result property="bizTags" column="bizTags"/>
<result property="breadcrumbHierarchy" column="breadcrumbHierarchy"/>
<result property="createdBy" column="createdBy"/>
<result property="createdOn" column="createdOn"/>
<result property="dynamicComponents" column="dynamicComponents"/>
<result property="keywords" column="keywords"/>
<result property="lastActivatedBy" column="lastActivatedBy"/>
<result property="lastActivatedOn" column="lastActivatedOn"/>
<result property="mvc" column="mvc"/>
<result property="owner" column="owner"/>
<result property="pagetype" column="pagetype"/>
<result property="publishedBy" column="publishedBy"/>
<result property="publishedOn" column="publishedOn"/>
<result property="status" column="status"/>
<result property="tags" column="tags"/>
<result property="updatedBy" column="updatedBy"/>
<result property="updatedOn" column="updatedOn"/>
<result property="url" column="url"/>
</resultMap>
<sql id="getTotalHubPagesDataTableUnp">
select /*+ parallel(SCHCM) parallel(SCHTI) parallel(SCHES) parallel(SCHO) parallel(SCHU) parallel(SCHS) */
hubId as hubId
,hubName as hubName
,schti.alfresco_trace_id as pageId
,schcm.title as pageTitle
,sches2.entitlement_set_name as entitlement
,breadcrumbHierarchy as breadcrumbHierarchy
,createdOn as createdOn
,dynamicComponents as dynamicComponents
,lastActivatedBy as lastActivatedBy
,lastActivatedOn as lastActivatedOn
,schu.user_key as owner
,pagetype as pagetype
,publishedBy as publishedBy
,publishedOn as publishedOn
,status_name as status
,updatedBy as updatedBy
,updatedOn as updatedOn
,url as url
from sc_hub_content_master schcm
inner join sc_hub_trace_ids schti
on schcm.trace_id_key = schti.trace_id_key
and schcm.pagetype='Page'
left join sc_hub_entitlements sches
on sches.entitlement_id=schcm.entitlement_set_id
left join sc_hub_owners scho
on scho.hub_content_key=schcm.hub_content_key
left join sc_hub_users schu
on schu.user_key = scho.user_id_key
left join sc_hub_statuses schs
on schs.status_id = schcm.status_id
inner join sc_hub_entitlement_sets sches2
on sches2.entitlement_set_id = schcm.entitlement_set_id
</sql>
<select id="getTotalHubPagesDataTableRowCount"
resultType="int"
parameterType="com.mycompany.myproduct.screport.model.AuthorizedHubRequest">
with
getTotalHubPagesDataTableUnp as (
<include refid="com.mycompany.myproduct.screport.mapper.hubportfolio.datatable.OwnerDashboard.getTotalHubPagesDataTableUnp"/>
)
select /*+parallel(AUTO) */
count(*)
from getTotalHubPagesDataTableUnp
</select>
<select id="getTotalHubPagesDataTable"
resultType="com.mycompany.myproduct.screport.model.OwnerTotalHubPagesDataTableRow"
resultMap="OwnerTotalHubPagesDataTableRow"
parameterType="com.mycompany.myproduct.screport.model.AuthorizedHubRequest">
with
getTHPDataTableUnp as (
<include refid="com.mycompany.myproduct.screport.mapper.hubportfolio.datatable.OwnerDashboard.getTotalHubPagesDataTableUnp"/>
),
getTHPDataTableRN as (
select gthdtup.*,rownum as full_set_rownum
from getTHPDataTableUnp gthdtup
),
getTHPDataTableRow0ToEnd as (
select *
from getTHPDataTableRN
<if test="requestIsPaginated">
FETCH FIRST #{calculatedMaximumNumberOfRows} ROWS ONLY
</if>
)
select *
from getTHPDataTableRow0ToEnd
<if test="requestIsPaginated">
<where>
full_set_rownum >= #{calculatedMinimumRowNumber}
</where>
</if>
</select>
</mapper>
SCHubOwnerDashboardServiceDaoImpl.getOwnerTotalHubPagesDataTablRowCount(...):
@Override
public int getOwnerTotalHubPagesDataTableRowCount( AuthorizedHubRequest authorizedHubRequest) throws SCExceptions {
System.out.println("@@@ authorizedHubRequest==null : "+ (authorizedHubRequest==null));
System.out.println("@@@ getSqlSession==null : " + (getSqlSession()==null) );
int result = getSqlSession().selectOne(
"com.mycompany.salesconnect.screport.mapper.hubportfolio.datatable.OwnerDashboard.getTotalHubPagesDataTableRowCount",authorizedHubRequest); // Line 76
closeSqlSession();
return result;
}
private SqlSession sqlSession;
@Override
public void closeSqlSession() {
if(sqlSession !=null) {
sqlSession.close();
sqlSession = null;
}
}