Я пытаюсь @Autowire
SessionFactory
в моем GWT сервлете. То, что я пытался первым был загружая его с помощью контекста приложения:Как @Autowire SessionFactory для сервлета?
this.sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory");
, но я думаю, что не работает таким образом, если я хочу использовать @Transactional
аннотацию. Вот почему я пытаюсь авто провода ему, говоря, что весна sessionFactory
это свойство необходимо установить над setSessionFactory(SessionFactory sessionFactory);
, но это не работает, либо как-то:
package com.mahlzeit.server.web.repository.impl;
// ..
@Component
public class RestaurantServiceImpl extends XsrfProtectedServiceServlet implements RestaurantService {
public RestauranOwnerRepository restaurantOwnerRepository;
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory ;
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
@SuppressWarnings("resource") // Do not close application context!
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/appServlet/servlet-context.xml");
//this.sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory");
this.restaurantOwnerRepository = (RestauranOwnerRepository)applicationContext.getBean("restaurantOwnerRepository");
}
@Transactional
@Override
public List<RestaurantDTO> getAvailableRestaurants() {
List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());
return ConvertEntity.converRestaurants(availableRestaurants);
}
}
В моей весны servlet-context.xml
у меня:
<context:component-scan base-package="com.mahlzeit.server.web" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:hibernate-webserver.cfg.xml" />
</bean>
<tx:annotation-driven/>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="restaurantServiceImpl" class="com.mahlzeit.server.web.service.restaurant.RestaurantServiceImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
то, что я получаю это org.hibernate.HibernateException
:
Caused by: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:988)
at com.mahlzeit.server.web.repository.impl.RestaurantOwnerRepositoryImpl.get(RestaurantOwnerRepositoryImpl.java:42)
at com.mahlzeit.server.web.repository.impl.RestaurantOwnerRepositoryImpl.getRestaurants(RestaurantOwnerRepositoryImpl.java:74)
at com.mahlzeit.server.web.service.restaurant.RestaurantServiceImpl.getAvailableRestaurants(RestaurantServiceImpl.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:587)
... 25 more
кто-нибудь знает, как я могу сделать эту работу? Я нашел this, но я не уверен, что это сработает, и кроме того, я не уверен, хочу ли я продлить XsrfProtectedServiceServlet
.
Благодарим за помощь!
На самом деле это не связано с GWT: «RemoteServiceServlet» - это «просто» сервлет. Это действительно весенний вопрос: «Как настроить Spring/webapp для использования' @ Transactional' и '@ Autowired' в сервлете?» –
@ThomasBroyer Теперь, когда вы говорите, что я согласен! – displayname