2012-04-24 27 views
20

im gettting lỗi saumùa xuân và ngủ đông: Không có phiên tìm thấy cho thread hiện hành

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) 

lớp Service

@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); 

    } 
} 

chút của lớp 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; 
    } 

và tôi có điều này trong my application-context.xml

0 của tôi

ai có thể nhận ra tại sao tôi nhận được lỗi sau?

+0

câu trả lời của jordan002 là chính xác, nhưng vấn đề "thực" là thay vì gọi DAO trong dịch vụ của bạn, bạn đang truy cập DB từ lớp dịch vụ ... Nói cách khác, bạn muốn phương thức dịch vụ xử lý giao dịch thay vì chỉ các phương thức DAO - nếu bạn có 2 cập nhật trong phương thức dịch vụ và phương thức thứ hai không thành công, giao dịch không giúp bạn có DB phù hợp (nhưng nó phụ thuộc vào logic nghiệp vụ của bạn) . – Betlista

Trả lời

40

Bạn đã chú thích lớp Dao của bạn bằng @Transactional, nhưng không chú ý đến lớp dịch vụ của bạn. Dòng:

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

yêu cầu bạn phải tham gia giao dịch.

Bạn có thể sửa lỗi này bằng cách thêm chú thích @Transactional vào lớp ProfileService của bạn hoặc chỉ phương thức registerVisitor().

+0

Điều này đi xa hơn và giúp với việc ngủ đông để viết cập nhật/xóa. – iowatiger08

5

thay đổi chú thích DAO của bạn với @Repository

@Repository 
public class ProfileDao { 
. 
. 
. 
} 

và sau đó thực hiện phương pháp dịch vụ của bạn @Transactional ví dụ như thế này

@Transactional 
public List<Retailer> getRetailerByRetailerNumber(String retailerNo) {} 
9

tôi giải quyết vấn đề tương tự với sau 2 bước

  1. Đặt @Transactional trên phương thức dịch vụ theo đề xuất jordan002 trong câu trả lời của mình trên trang này.

  2. hơn Một điều, Nếu bạn có 2 file cấu hình: nói application-context.xml (Đối với DB và bối cảnh ứng dụng cụ thể cấu hình) và webmvc-context.xml (Đối với web/điều khiển cụ thể cấu hình), sau đó bạn nên quét các gói khác nhau cho bạn bộ điều khiển và dao.

    webmvc-context.xml được tải sau application-context.xml. Tôi nghĩ rằng lớp DAO được nạp đầu tiên với tham chiếu giao dịch khi ứng dụng-context.xml được tải, nhưng nó được thay thế bằng đối tượng khác, không có tham chiếu giao dịch, khi tải webmvc-context.xml.

    Bất kỳ cách nào, tôi giải quyết vấn đề với các gói cụ thể được quét:

    <context:component-scan base-package="com.app.repository" /> 
    

    cho application-context.xml

    <context:component-scan base-package="com.app.web" /> 
    

    cho webmvc-context.xml.

1

Tôi biết đây là câu hỏi có tuổi, nhưng tôi gặp sự cố này và thấy rằng nếu bạn đang sử dụng cấu hình Spring-Java, thì độ phân giải có một vài phần. Vị trí tương đối của một số cấu hình cho bộ điều khiển là quan trọng.

Thứ nhất, 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; 
} 

... 

Trong Controller, tôi đã phải thiết lập

@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; 
} 
} 

Các WarehouseDAO có chú thích @Repository và SessionFactory không phải là Autowired.

Hy vọng điều này sẽ giúp người khác có câu hỏi tương tự.

0

Tôi sẽ chỉ thêm một thứ khiến tôi mất thời gian để gỡ lỗi: đừng quên rằng chú thích @Transactional sẽ chỉ hoạt động trên các phương thức "công khai".

Tôi đặt một số @Transactional trên "được bảo vệ" và nhận được lỗi này.

Hy vọng nó sẽ giúp :)

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

Phương pháp tầm nhìn và @Transactional

Khi sử dụng proxy, bạn nên áp dụng các chú thích @Transactional chỉ với các phương pháp với tầm nhìn công cộng. Nếu bạn đã bảo vệ chú thích, các phương thức riêng hoặc gói có thể nhìn thấy bằng chú thích @Transactional, không có lỗi nào được nêu ra, nhưng phương pháp được chú thích không hiển thị các cài đặt giao dịch được định cấu hình . Hãy xem xét việc sử dụng AspectJ (xem bên dưới) nếu bạn cần chú thích các phương pháp phi công cộng.

2

tôi giải quyết vấn đề trên bằng cách làm theo hai bước

1-Thêm hỗ trợ @Transactional trong phương pháp dịch vụ của tôi mà đang kêu gọi các phương pháp DAO

2-Bằng cách nhập các applicationContext.xml vào mùa xuân-servlet .xml theo cách này

<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 /> 

Nó loại bỏ sự cần thiết phải quét gói độ tuổi ở hai nơi spring-servlet.xml và applicationContext.xml

Các vấn đề liên quan