2013-08-10 4 views
3

Я пытаюсь заставить Spring работать в моем проекте Playframework 2.1, но пока не добился успеха. Я следую Guilliaume Bort's tutorial о том, как заставить его работать. Проект запускается правильно, он вызывает действие (через GET) signupForm штраф (как описано ниже), но когда я пытаюсь отправить форму, я получаю следующее исключение:Получение Spring для работы с Play Framework 2.1 (java)

Exception gotten

Это, кажется, не нравится @Transactional аннотация. Это часть моего код контроллера:

@org.springframework.stereotype.Controller 
public class UserController extends Controller { 
    @Autowired 
    private UserService userService; 

    public Result signupForm() { 
     // This is the initial method called via GET (works fine) 
    } 

    @Transactional 
    public Result signup() { 
      ... code .... 
      userService.save(user); // call to the injected service 
      ... more code ... 
     } 
    } 
    ... mode code ... 

Это мой components.xml (помещаемый в/конфе):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="controllers, services, dataaccess, models"/> 
</beans> 

(DATAACCESS где размещены мой даосские в)

Это часть моего обслуживания (на всякий случай это необходимо):

@Service("userService") 
public class UserService { 
    @Autowired 
    private UserDao userDao; 
    ... more code ... 

И, наконец, это является частью соответствующего Dao для этого случая:

@Repository("userDao") 
public class UserDaoJpa implements UserDao { 
    ... more code ... 

Как вы можете видеть на изображении ниже, метод getControllerInstance в Global пытается получить экземпляр транзакционной аннотацию, и я не знаю, почему. Для меня это не должно пытаться создать экземпляр. Весной это не событие в автосканируемых пакетах.

This is what spring tries to instantiate

Спасибо за любую помощь вы можете предоставить.

PS: Я новичок в весне.

ответ

3

Возможно, вы импортировали play.db.jpa.Transactional вместо org.springframework.transaction.annotation.Transactional.

Первый переносит аннотированное действие в TransactionalAction, о котором Spring не имеет понятия и, следовательно, поиск не срабатывает.

Возможно, вы также захотите перенести обработку транзакций на ваш сервисный уровень.

+0

Genius! Оно работает! Спасибо. – Franco

+0

У меня возникла новая проблема: теперь я получаю исключение: «Execution exception [[RuntimeException: No EntityManager, связанный с этим потоком. Попробуйте аннотировать ваш метод действий с помощью @ play.db.jpa.Transactional]]». Кажется, потому, что я удаляю play.db.jpa.Transactional из своего действия и добавил весенний Transactional в свой сервис. Что я мог сделать? – Franco

+0

@monkeydeveloper Я не вижу диспетчера транзакций, настроенного в вашем контексте. Попробуйте добавить ' ' и его зависимости в 'components.xml '. Подробнее об этом [здесь] (http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html) – soulcheck

-2

Просто зарегистрировать класс TransactionalAction в свой весенний контекст

<bean class="play.db.jpa.TransactionalAction"/> 
Смежные вопросы