Подтвердить что ты не робот

Использование Spring MVC 3.0 и @EJB аннотации wtihout mappedName?

Я делаю новый Java webapp с Spring MVC 3.0 и хочу использовать как можно больше стандартных Java EE 6. (Я на Glassfish 3.1.1.) Настоящий драйвер хочет использовать веб-структуру MVC, а не JSF.

Итак, я ищу лучший способ для ввода EJB в мои контроллеры Spring. У меня был некоторый успех, но я не доволен тем, как это выглядит, и я надеялся найти лучший способ.

Это сработало, найдя EJB через JNDI:

// EJB 
@Stateless
public class Service {
  @PersistenceContext(name="MAIN")
  private EntityManager em;

  public void doSomething() { .... } 

}

// Spring 
@Controller
public class HomeController {
   @EJB(mappedName="java:global/springtest/Service") 
   private Service service;

   // controller methods use service 
}

Но я недоволен необходимостью "mappedName" в аннотации @EJB в контроллере.

Есть ли лучший способ сделать это?

Хорошей новостью является то, что я могу использовать ту же @Inject-аннотацию в EJB и Spring beans, и единственная разница в том, какая структура создает объект и делает инъекцию.

4b9b3361

Ответ 1

Если вы используете

mappedName="java:module/Service"

вместо

mappedName="java:global/springtest/Service"

вам не нужно беспокоиться о appname. Это делает код более переносимым. Я думаю, это решит некоторые из ваших проблем.

Ответ 2

Для Spring вы можете перенести JNDI-поиск в JndiObjectFactoryBean:

<bean id="serviceBean" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:global/springtest/Service" />
    <property name="resourceRef" value="true" />
</bean>

Тогда вы, вероятно, (исправите меня, если я ошибаюсь), смогут использовать его с @Inject без аннотации @Named("serviceBean"):

@Inject
private Service service;