2012-03-04 2 views
2

Я пытаюсь заменить мои аннотации CDI/EJB на Spring. Но я изо всех сил пытаюсь сделать это правильно.Миграция аннотаций CDI/EJB на аннотации Spring

Это то, что я имею в КДИ/EJB:

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
class Service { 
    @Inject 
    EntityManager em; 
} 


@Named 
@RequestScoped 
class Facade { 
    @Inject 
    Service service; 
} 

Теперь я хотел бы сделать следующее:

@Stateless 
@Transactional 
@Repository 
class Service { 
    @Inject 
    EntityManager em; 
} 

Как насчет лица без гражданства? Что такое аквивалент весной? Очевидные Я не могу просто удалить эту аннотацию, бв, то я получаю эти исключения:

javax.el.PropertyNotFoundException: /input.xhtml @15,30 registerButtonAction="#{facade.createNew()}": The class 'Facade$Proxy$_$$_WeldClientProxy' does not have the property ... 

Далее:

@Named 
@Service 
class Facade { 
    @Autowired 
    Service service; 
} 

Должен ли я просто заменить все @Inject аннотаций с @Autowired? Есть что-то весеннее, что заботится об именах EL, чтобы я мог удалить @Named?

Должен ли я также аннотировать мои сущности JPA?

+3

Зачем вам это нужно? Не пытаясь начать пламенную войну, просто любопытно. – NBW

+0

Весенние аннотации bc делают вещи очень легкими. например, аспекты, могут перехватывать исключения во всех аннотированных классах @Component. – membersound

+1

EE6/EJb 3.1/CDI также предлагает такие функциональные возможности с аннотациями, перехватчиками и т. Д. В этом случае я не вижу значения в попытке переключиться, но это только я. – NBW

ответ

1

Stateless и Stateful Фасоль EJB концепции, но Spring предлагает аналогичные услуги через сервисные бобы. Поместите аннотацию @Service в свои классы бизнес-логики, и если вы хотите, чтобы ваши beans были «без гражданства» или «stateful», просто настройте область вашего компонента (например, Request или Session).

Spring также имеет встроенный API управления транзакциями, поэтому ваши аннотации к транзакциям, возможно, потребуется изменить.

И, наконец, Spring совместим со многими системами сохранения, включая JPA. Если вы хотите сохранить JPA это нормально, и вы можете изменить его на другой технологии, если вы хотите (возможно Hibernate или MyBatis)

1

Концепции без гражданства и состояния - EJB; У этой весны такого понятия нет. Spring использует POJO, без поддержки боба состояния. Ты сам по себе.

Spring использует javax.annotation.Resource аннотация; Я бы предпочел это до @Autowired.

1

Spring поддерживает @Inject и @Named непосредственно. Не нужно использовать @Autowired и @Component (эквиваленты весны), если вы этого не хотите. Не нужно также вводить @Resource.

// This is a singleton by default, which is OK since you previously 
// had it marked as stateless 
@Named 
@Transactional(propagation=Propagation.REQUIRES_NEW) 
class Service { 
    @PersistenceContext // Use JPA's usual annotation 
    EntityManager em; 
} 

// You may not still need this, but if you do ... 
@Named 
@Scope("request") 
class Facade { 
    @Inject 
    Service service; 
} 
Смежные вопросы