[SPRING] 봄과 최대 절전 모드 : 현재 스레드에 대한 세션이 없습니다.
SPRING봄과 최대 절전 모드 : 현재 스레드에 대한 세션이 없습니다.
다음과 같은 오류가 나타납니다.
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1024)
at com.fexco.shoptaxfreemobile.service.ProfileService.registerVisitor(ProfileService.java:57)
at com.fexco.shoptaxfreemobile.controller.ProfileController.registerVisitor(ProfileController.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.fexco.shoptaxfreemobile.jsonp.JsonpCallbackFilter.doFilter(JsonpCallbackFilter.java:33)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
서비스 클래스
@Service
public class ProfileService {
@Resource(name = "mySessionFactory")
private SessionFactory sessionFactory;
@Autowired
private ProfileDao profileDao;
private class CountrySorter implements Comparator<Country> {
@Override
public int compare(Country country1, Country country2) {
if ( country1.getId().compareTo(new Long (3)) < 0){
return country1.getId().compareTo(country2.getId());
}
return country1.getName().compareToIgnoreCase(country2.getName());
}
}
public List<Country> getCountries() {
List<VisitorCountry> visitorCountries = profileDao.getAllCountries();
List<Country> countries = new ArrayList<Country>();
for ( VisitorCountry country : visitorCountries){
countries.add(country.getCountry());
}
Comparator<Country> comparator = new CountrySorter();
Collections.sort(countries, comparator);
return countries;
}
public RegisterResponse registerVisitor(JsonVisitor visitorDetails){
Visitor storedVisitor = (Visitor) sessionFactory.getCurrentSession().get(Visitor.class, visitorDetails.getTfscNumber(), LockMode.NONE);
if ( storedVisitor == null){
storedVisitor = new Visitor(visitorDetails);
}else{
storedVisitor.setVisitorDetails(visitorDetails);
}
try{
sessionFactory.getCurrentSession().saveOrUpdate(storedVisitor);
}catch(Exception ex){
return new RegisterResponse(false, "Failed To Register Card. Please Try Again Later.", visitorDetails);
}
return new RegisterResponse(true, "", visitorDetails);
}
}
DAO 클래스의 비트
@Service
@Transactional
public class ProfileDao {
@Resource(name = "mySessionFactory")
private SessionFactory sessionFactory;
public List getAllCountries(){
List<VisitorCountry> visitorCountries = sessionFactory.getCurrentSession()
.getNamedQuery("GET_ALL_COUNTRIES").list();
return visitorCountries;
}
public List<Retailer> getRetailerByRetailerNumber(String retailerNo) {
List<Retailer> retailerByRetailerNumber = sessionFactory.getCurrentSession()
.getNamedQuery("FindRetailerByRetailerNo").setString("retailerNo", retailerNo).list();
return retailerByRetailerNumber;
}
나는 이것을 application-context.xml에 가지고있다.
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="hibernateProperties">
<value>
<![CDATA[
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
]]>
</value>
</property>
</bean>
누구든지 내가 왜 다음과 같은 오류가 나타나고 있습니다 지점 수 있습니까?
해결법
-
==============================
1.Dao 클래스에 @Transactional이라는 주석을 달았지만 서비스 클래스에는 주석을 달지 않았습니다. 라인 :
Dao 클래스에 @Transactional이라는 주석을 달았지만 서비스 클래스에는 주석을 달지 않았습니다. 라인 :
Visitor storedVisitor = (Visitor) sessionFactory.getCurrentSession().get(Visitor.class, visitorDetails.getTfscNumber(), LockMode.NONE);
당신은 거래가 필요합니다.
@Transactional 주석을 ProfileService 클래스에 추가하거나 registerVisitor () 메소드 만 추가하여이 문제를 해결할 수 있습니다.
-
==============================
2.나는 다음 두 단계로 같은 문제를 해결했다.
나는 다음 두 단계로 같은 문제를 해결했다.
-
==============================
3.@Repository를 사용하여 DAO의 주석을 변경하십시오.
@Repository를 사용하여 DAO의 주석을 변경하십시오.
@Repository public class ProfileDao { . . . }
그리고 나서 다음과 같이 서비스 메소드를 @Transactional로 만드십시오.
@Transactional public List<Retailer> getRetailerByRetailerNumber(String retailerNo) {}
-
==============================
4.나는 두 단계를 따라 위의 문제를 해결했다.
나는 두 단계를 따라 위의 문제를 해결했다.
1- DAO 메소드를 호출하는 서비스 메소드에서 @Transactional 지원 추가하기
2 - spring-servlet.xml에서 applicationContext.xml을이 방식으로 가져옴으로써
<import resource="applicationContext.xml" /> <mvc:annotation-driven /> <context:component-scan base-package="com.json.api.*" /> <!--Third Party Integration should be injected in xml start here --> <bean id="integrationInterface" class="com.json.api.IntegerationInterface"></bean> <!--Third Party Integration should be injected in xml start here --> <mvc:interceptors> <bean id="apiServiceInterceptor" class="com.json.api.interceptor.ApiServiceInterceptor"></bean> </mvc:interceptors> <!--To Enable @Value to map key with provided fields for property files --> <context:property-placeholder />
spring-servlet.xml과 applicationContext.xml의 두 위치에서 패키지를 검색 할 필요가 없습니다.
-
==============================
5.나는 이것이 어느 시대의 문제라는 것을 알고 있지만,이 문제에 부딪쳤다. Spring-Java 설정을 사용하고 있다면, 해결책은 이것에 몇 부분이 있다는 것을 발견했다. 일부 구성을 컨트롤러에 상대적으로 배치하는 것이 중요했습니다.
나는 이것이 어느 시대의 문제라는 것을 알고 있지만,이 문제에 부딪쳤다. Spring-Java 설정을 사용하고 있다면, 해결책은 이것에 몇 부분이 있다는 것을 발견했다. 일부 구성을 컨트롤러에 상대적으로 배치하는 것이 중요했습니다.
첫째, CoreConfiguration
@Configuration public class CoreConfiguration { @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean factoryBean = new org.springframework.orm.hibernate4.LocalSessionFactoryBean(); String annotatedPckgs[] ={"org.tigersndragons.reports.model.warehouse"}; factoryBean.setAnnotatedPackages(annotatedPckgs); Properties hibernateProperties = new Properties(); try { hibernateProperties.load(this.getClass().getResourceAsStream("props/hibernate.properties")); factoryBean.setHibernateProperties(hibernateProperties); } catch (IOException e) { } factoryBean.setPackagesToScan("org.telligen.reports.model.warehouse"); factoryBean.setDataSource(warehouseDataSource());//("jdbc/warehouse"); try { factoryBean.afterPropertiesSet(); } catch (IOException e) { } return factoryBean; } @Bean public WarehouseDAO getWarehouseDAO(){ WarehouseDAO wrhsDao = new WarehouseDAO(); wrhsDao.setSessionFactory(sessionFactory().getObject()); return wrhsDao; }
...
@Configuration public class ScheduleConfiguration { private static Logger logger = LoggerFactory.getLogger(ScheduleConfiguration.class); @Autowired private CoreConfiguration coreConfiguration; @Bean public HandlerMapping handlerMapping(){ DefaultAnnotationHandlerMapping mapping = new DefaultAnnotationHandlerMapping(); mapping.setInterceptors(new Object []{coreConfiguration.openSessionViewInterceptor()}); return mapping; } @Bean public HandlerAdapter handerAdapter(){ return new AnnotationMethodHandlerAdapter(); } @Bean public ScheduleController scheduleController() throws Exception{ ScheduleController controller = new ScheduleController(); controller.setWrhsDao(coreConfiguration.getWarehouseDAO()); return controller; } ...
컨트롤러에서 설정해야했습니다.
@Controller @RequestMapping public class ScheduleController { private static Logger logger = LoggerFactory.getLogger(ScheduleController.class); private WarehouseDAO wrhsDao; @RenderMapping @RequestMapping("VIEW") public String viewSchedule(Map<String, Object> modelMap){...} public void setWrhsDao(WarehouseDAO wrhsDao) { this.wrhsDao = wrhsDao; } }
WarehouseDAO에는 @Repository 주석이 있고 SessionFactory는 Autowired가 아닙니다.
희망이 비슷한 질문을 다른 사람이 도움이됩니다.
-
==============================
6.디버깅 할 시간이 필요했던 부분을 추가 할 것입니다. @Transactional 어노테이션은 "public"메소드에서만 작동한다는 것을 잊지 마십시오.
디버깅 할 시간이 필요했던 부분을 추가 할 것입니다. @Transactional 어노테이션은 "public"메소드에서만 작동한다는 것을 잊지 마십시오.
나는 "보호 된"것들에 @Transactional을 넣었고이 오류가 발생했습니다.
희망이 도움이 :)
http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html
from https://stackoverflow.com/questions/10298483/spring-and-hibernate-no-session-found-for-current-thread by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring의 JSF 뷰 범위 (0) | 2018.12.12 |
---|---|
[SPRING] 스프링 데이터 : "삭제 기준"이 지원됩니까? (0) | 2018.12.12 |
[SPRING] JPA @Entity 내부의 빈 주입 (0) | 2018.12.12 |
[SPRING] 커스텀 컨트롤러 메소드를위한 Spring Boot에서 HAL 직렬화 사용 (0) | 2018.12.12 |
[SPRING] 클라이언트가 보낸 요청은 구문 상 올바르지 않습니다.-Spring MVC + JDBC 템플릿 (0) | 2018.12.12 |