복붙노트

[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. ==============================

    1.Dao 클래스에 @Transactional이라는 주석을 달았지만 서비스 클래스에는 주석을 달지 않았습니다. 라인 :

    Dao 클래스에 @Transactional이라는 주석을 달았지만 서비스 클래스에는 주석을 달지 않았습니다. 라인 :

    Visitor storedVisitor =
        (Visitor) sessionFactory.getCurrentSession().get(Visitor.class,
                visitorDetails.getTfscNumber(), LockMode.NONE);
    

    당신은 거래가 필요합니다.

    @Transactional 주석을 ProfileService 클래스에 추가하거나 registerVisitor () 메소드 만 추가하여이 문제를 해결할 수 있습니다.

  2. ==============================

    2.나는 다음 두 단계로 같은 문제를 해결했다.

    나는 다음 두 단계로 같은 문제를 해결했다.

  3. ==============================

    3.@Repository를 사용하여 DAO의 주석을 변경하십시오.

    @Repository를 사용하여 DAO의 주석을 변경하십시오.

    @Repository
    public class ProfileDao { 
    .
    .
    .
    }
    

    그리고 나서 다음과 같이 서비스 메소드를 @Transactional로 만드십시오.

    @Transactional
    public List<Retailer> getRetailerByRetailerNumber(String retailerNo) {}
    
  4. ==============================

    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. ==============================

    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. ==============================

    6.디버깅 할 시간이 필요했던 부분을 추가 할 것입니다. @Transactional 어노테이션은 "public"메소드에서만 작동한다는 것을 잊지 마십시오.

    디버깅 할 시간이 필요했던 부분을 추가 할 것입니다. @Transactional 어노테이션은 "public"메소드에서만 작동한다는 것을 잊지 마십시오.

    나는 "보호 된"것들에 @Transactional을 넣었고이 오류가 발생했습니다.

    희망이 도움이 :)

    http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html

  7. from https://stackoverflow.com/questions/10298483/spring-and-hibernate-no-session-found-for-current-thread by cc-by-sa and MIT license