2015-08-19 5 views
0

Я пытаюсь @AutowireSessionFactory в моем 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.

Благодарим за помощь!

+0

На самом деле это не связано с GWT: «RemoteServiceServlet» - это «просто» сервлет. Это действительно весенний вопрос: «Как настроить Spring/webapp для использования' @ Transactional' и '@ Autowired' в сервлете?» –

+0

@ThomasBroyer Теперь, когда вы говорите, что я согласен! – displayname

ответ

0

Не знаком с GWT, но я бы не реализовал сервис в сервлете. Я бы слой службы и ввести компонент в сервлет, таким образом, вы получаете сделки готовый сервис вы можете использовать:

public class RestaurantServlet extends HttpServet{ 
    @Autowired 
    private RestaurantService service; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
     WebApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); 
     ac.getAutowireCapableBeanFactory().autowireBean(this); 
    } 
} 

Согласно XsrfProtectedServiceServlet's javadoc это экспериментальный сервлет не рекомендуется использовать в производстве код:

ЭКСПЕРИМЕНТАЛЬНЫЕ И МОТОРЧЕСКИЕ УСЛОВИЯ могут быть изменены. Не используйте это в производстве код .

+0

Хм, подумал, что я буду использовать сервлеты как служебный. Это плохая идея? Если я создам еще один «RestaurantService», не получится ли в моем сервлете иметь только однострочные? Что касается экспериментального статуса [я получил это] (http://stackoverflow.com/questions/31784521/should-i-use-xsrfprotectedserviceservlet-despite-its-experimental-declaration), но спасибо за подсказку :) – displayname

+0

Я используется для типичной архитектуры Spring MVC: контроллер вызывает DAO класса обслуживания. Возможно, это правильный способ сделать это в GWT. – codependent

+0

Я пытаюсь сделать то, что вы предлагаете, но «service» имеет значение null в моем случае. Должен ли я объявлять это в моем «servlet-context.xml» каким-то образом? – displayname

Смежные вопросы