Использование CDI + WS / RS + JPA для создания приложения
Вопрос
@Path(value = "/user")
@Stateless
public class UserService {
@Inject
private UserManager manager;
@Path(value = "/create")
@GET
@Produces(value = MediaType.TEXT_PLAIN)
public String doCreate(@QueryParam(value = "name") String name) {
manager.createUser(name);
return "OK";
}
}
Вот диспетчер пользователей
public class UserManager {
@PersistenceContext(unitName = "shop")
private EntityManager em;
public void createUser(String name) {
User user = new User();
user.setName(name);
// skip some more initializations
em.persist(user);
}
}
Проблема в том, что если я не отмечу пользовательский сервис как @Stateless, тогда поле Manager является NULL
Но если я помечу @Stateless, у меня может быть введен поле менеджера, и приложение работает, как я могу получить данные, сохраненные в БД
Просто интересно, в чем причина этого?
И это предпочтительным способом проводки приложения?
Ну, я думаю, чтобы вытащить Entitymanager до продюсера, так что его можно поделиться
Решение
Проблема в том, что если я не отмечу пользовательский сервис как @Stateless, тогда поле Manager является NULL
Для инъекций, чтобы иметь место, класс должен быть Управляемый компонент такие как корпоративные бобы, сервлеты, фильтры, JSF управляемые бобы и т. д. CDI управляемый боб (Это новая часть с Java EE 6, вы можете сделать любой класс управляемый боб с CDI).
Таким образом, если вы не сделаете свой JAX-RS конечную точку EJB, как включить впрыск? Это красиво объяснено в Jax-RS и интеграция CDI с использованием GlassFish V3:
Существует два способа управляемых CDI Beans включен:
Суммарируется CDI, Life-Cycle управляемый Джерси. Аннотировать с
@ManagedBean
и необязательно аннотируют с аннотацией массы Джерси.создал и управляется CDI. Аннотировать с аннотацией CDI, как
@RequestScoped
(нет@ManagedBean
требуется для)
Я также предлагаю проверять ресурсы ниже.
И это предпочтительным способом проводки приложения?
Я бы сказал да. CDI очень хорошая и ... Тебе не нравится инъекция?
Ну, я думаю, чтобы вытащить Entitymanager до продюсера, так что его можно поделиться
Поделился между тем, что? И почему? В вашем случае вы должны использовать EntityManager
с течением времени, который имеет место для одной транзакции ( контекст настойчивости с транзакциями). Другими словами, не разделяйте его (и не беспокойтесь о открытии и закрытии его для каждого запроса, это не дорогая операция).
использованная литература
- Спецификация JPA 2.0
- Раздел 7.6 «Контейнерные контейнерные контейнерные контексты»
- Раздел 7.6.1 "Контекст настоится контейнерным контекстом, управляемый контейнерным транзакциями"
- Раздел 7.6.2 "Управляемый контейнером расширенный контекст постоянства"
Ресурсы
Другие советы
То @Singleton. Аннотация поможет: http://www.maxby.com/paul-sandoz/jax-rs-on-glassfish-31-ejb-inized.html.