Blue Chicken - The Legend Of Zelda
본문 바로가기

개인공부

[egovframework template]ibatis에서 mybatis로

1. 일단 ibatis 설정하고 있는 템플릿을 모두 없애기로 마음먹음

7월 27, 2024 10:56:04 오전 org.apache.catalina.core.StandardContext listenerStart심각: Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmmUseDAO': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.orm.ibatis.SqlMapClientFactoryBean] for bean with name 'egov.sqlMapClient' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.orm.ibatis.SqlMapClientFactoryBean	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:321)

 

MyBatis와 iBATIS 간에는 몇 가지 중요한 차이점이 있습니다. MyBatis는 iBATIS의 후속 프로젝트로서 몇 가지 개선된 기능과 차별점을 제공합니다. 그러나 기본적인 개념은 유사합니다.

현재 에러 메시지는 org.springframework.orm.ibatis.SqlMapClientFactoryBean 클래스를 찾을 수 없다는 것을 나타내며, 이는 여전히 iBATIS 설정을 사용하고 있음을 의미합니다.

MyBatis와 iBATIS 간의 DAO 작성 방법의 주요 차이점은 다음과 같습니다:

iBATIS에서 DAO 작성

iBATIS에서는 DAO 클래스를 작성할 때 SqlMapClient 객체를 사용합니다. iBATIS 설정 파일(sql-map-config.xml)과 SQL 맵 파일이 필요합니다. iBATIS에서는 SqlMapClientTemplate 클래스를 사용하여 SQL 실행을 수행합니다.

MyBatis에서 DAO 작성

MyBatis에서는 DAO 클래스를 인터페이스로 정의하고, MyBatis가 이 인터페이스의 구현체를 자동으로 생성합니다. MyBatis 설정 파일(mybatis-config.xml)과 매퍼 XML 파일이 필요합니다.

MyBatis로 전환하기 위해 필요한 변경 사항

  1. iBATIS 설정 제거
    • 모든 iBATIS 관련 설정을 제거합니다.
  2. MyBatis 설정 추가
    • context-sqlMap.xml 파일을 업데이트하여 MyBatis 설정을 추가합니다.
    • MyBatis 매퍼 XML 파일을 작성합니다.
  3. DAO 인터페이스 작성
    • MyBatis 스타일로 DAO 인터페이스를 작성합니다.

아래는 iBATIS 설정을 제거하고 MyBatis로 전환하기 위한 예시입니다:

context-sqlMap.xml 업데이트

기존 iBATIS 설정을 제거하고 MyBatis 설정을 추가합니다.

xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                           http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
                           http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">

    <!-- 환경설정 기본정보를 globals.properties 에서 참조하도록 propertyConfigurer 설정  -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:/egovframework/egovProps/globals.properties</value>
                <!-- value>file:/product/jeus/egovProps/globals.properties</value-->
            </list>
        </property>
    </bean>
    
    <!-- datasource 설정(propertyConfigurer 활용) -->
    <alias name="dataSource-${Globals.DbType}" alias="dataSource" />
    <alias name="dataSource-${Globals.DbType}" alias="egov.dataSource" />
    
    <!-- hsql -->
    <jdbc:embedded-database id="dataSource-hsql" type="HSQL">
        <jdbc:script location="classpath:/db/shtdb.sql"/>
    </jdbc:embedded-database>
    
    <!-- mysql -->
    <bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${Globals.DriverClassName}"/>
        <property name="url" value="${Globals.Url}"/>
        <property name="username" value="${Globals.UserName}"/>
        <property name="password" value="${Globals.Password}"/>
    </bean>
    
    <!-- MyBatis SqlSessionFactory 설정 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource-mysql"/>
        <property name="mapperLocations" value="classpath:/egovframework/sqlmap/*.xml"/>
    </bean>

    <!-- MyBatis SqlSessionTemplate 설정 -->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
    
</beans>

DAO 인터페이스 작성

MyBatis에서는 DAO 인터페이스를 정의하고 매퍼 XML 파일에서 SQL 문을 매핑합니다.

java
코드 복사
package egovframework.let.main.data; import java.util.List; public interface UserMapper { List<User> selectAllUsers(); }

매퍼 XML 파일 작성

egovframework/sqlmap/UserMapper.xml 파일을 작성하여 SQL 문을 매핑합니다.

xml
package egovframework.let.main.data;

import java.util.List;

public interface UserMapper {
    List<User> selectAllUsers();
}

이와 같이 설정을 변경하면 iBATIS 설정을 제거하고 MyBatis로 전환할 수 있습니다. MyBatis 설정이 제대로 적용되었는지 확인한 후 애플리케이션을 다시 시작해 보세요.


2.그냥 오류 된다고 하는 ibatis 관련 api 들고 있는 파일 싹 다 지움, 그랬더니 이거 뜸 이건 내가 써야하는건데..

심각: Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionTemplate' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\sqlmap\UserMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for egovframework.let.main.data.UserMapper.selectAllUsers
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:321)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1268)
	at org.sp

에러 메시지에 따르면 UserMapper.xml 파일에서 중복된 매핑이 존재하는 것으로 보입니다. egovframework.let.main.data.UserMapper.selectAllUsers에 대한 매핑이 두 번 정의되어 있습니다. 이는 MyBatis가 동일한 매핑 ID를 두 번 읽으려고 할 때 발생하는 일반적인 문제입니다.

이 문제를 해결하기 위해 다음 단계를 따라보세요:

  1. UserMapper.xml 파일을 확인: UserMapper.xml 파일에서 중복된 매핑 정의가 있는지 확인합니다. 중복된 매핑 정의를 제거하세요.
  2. Context 설정 확인: context-sqlMap.xml 파일에서 MyBatis 매퍼 설정을 확인합니다. mapperLocations 속성에 동일한 경로가 두 번 이상 포함되어 있는지 확인하고, 중복된 경로를 제거하세요.
  3. 전체 설정 파일 확인: 설정 파일 전체에서 UserMapper.xml이 중복으로 로드되지 않도록 설정을 확인합니다.

 

일단 context-sqlMap.xml에서 호출하던 SqlMapClient 설정을 죽임

그랬더니 

 

3. UserService를 수정함

월 27, 2024 11:38:51 오전 org.apache.catalina.core.StandardContext listenerStart
심각: Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionTemplate' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\sqlmap\UserMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for egovframework.let.main.data.UserMapper.selectAllUsers
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:321)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1268)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
package egovframework.let.main.service;

import java.util.List;

//import javax.annotation.Resource;

//import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import egovframework.let.main.data.User;
import egovframework.let.main.data.UserMapper;

@Service("userService")
public class UserService {

	/*
	@Resource(name="sqlSessionTemplate")
    private SqlSessionTemplate sqlSession;

    public List<User> selectAllUsers() {
        return sqlSession.getMapper(UserMapper.class).selectAllUsers();
    }
    */
	
	@Autowired
    private UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.selectAllUsers();
    }

}

4. mybatis-config에 mapper 지정되어 있던걸 삭제함

 

<mappers>
        <mapper resource="egovframework/sqlmap/UserMapper.xml" />
    </mappers>

 

이 부분 삭제

월 27, 2024 11:56:19 오전 org.apache.catalina.core.StandardContext listenerStart
심각: Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userMapper'; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [egovframework.com.cmm.EgovMessageSource] for bean with name 'egovMessageSource' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-common.xml]; nested exception is java.lang.ClassNotFoundException: egovframework.com.cmm.EgovMessageSource
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
	at or

 

 

5. 여기서는 mysql 말고 다른 것들 선언 싹 다 없앰, pom.xml ,  context-datasource.xml  같은 곳에서 

Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'databaseType' threw exception; nested exception is java.lang.IllegalStateException: Driver for test database type [HSQL] is not available
	at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:121)
	at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1566)
	... 43 more

 

6. 성공

7. userlist 호출하니까 또 에러..;

 

7월 27, 2024 12:35:35 오후 org.apache.catalina.core.StandardWrapperValve invoke
심각: 경로 []의 컨텍스트 내의 서블릿 [action]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'net.sf.log4jdbc.DriverSpy'
### The error may exist in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\sqlmap\UserMapper.xml]
### The error may involve egovframework.let.main.data.UserMapper.selectAllUsers
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'net.sf.log4jdbc.DriverSpy']을(를) 발생시켰습니다.
java.lang.ClassNotFoundException: net.sf.log4jdbc.DriverSpy
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220)
	at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1420)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
	at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
	at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
	at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:84)
	at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:70)
	at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336)
	at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	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:434)
	at com.sun.proxy.$Proxy33.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:231)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
	at com.sun.proxy.$Proxy34.selectAllUsers(Unknown Source)
	at egovframework.let.main.service.UserService.getAllUsers(UserService.java:31)
	at egovframework.let.main.web.MainController.userList(MainController.java:41)
	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.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)