Использование CDI + WS / RS + JPA для создания приложения - PullRequest
5 голосов
/ 19 сентября 2010
@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";
    }
}

вот менеджер пользователя impl

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);
    }
}

проблема в том, что если я не помечаю UserService как @Stateless, тогда поле менеджера пустое

но если я отмечу @Stateless, я могу вставить поле менеджера, и приложение будет работать так, как будто я могу сохранить данные в db

просто интересно, в чем причина этого?

и является ли это предпочтительным способом подключения приложения?

хорошо, я думаю вытащить EntityManager к производителю, чтобы им можно было поделиться

Ответы [ 2 ]

8 голосов
/ 19 сентября 2010

проблема в том, что если я не отмечу UserService как @Stateless, тогда поле менеджера будет пустым

Для внедрения необходимо, чтобы класс был управляемым компонентом , таким как Enterprise Beans, Servlets, Filters, JSF-управляемые bean-компоненты и т. Д. Или CDI-управляемый bean-компонент (это В новой части Java EE 6 вы можете сделать любой класс управляемым компонентом с помощью CDI).

Итак, если вы не делаете свою конечную точку JAX-RS EJB, как включить инъекцию? Это хорошо объясняется в интеграции JAX-RS и CDI с использованием Glassfish v3 :

Существует два способа управления bean-компонентами CDI включены:

  1. создан CDI, жизненный цикл, управляемый Джерси. Аннотировать с @ManagedBean и при необходимости аннотировать с аннотацией объема Джерси.

  2. создается и управляется CDI. Аннотировать с помощью аннотации области CDI, как @RequestScoped (нет @ManagedBean требуется)

Я также предлагаю проверить ресурсы ниже.

и является ли это предпочтительным способом подключения приложения?

Я бы сказал, да. CDI очень хороший и ... тебе не нравится инъекция?

ну, я думаю вытащить EntityManager к производителю, чтобы им можно было поделиться

Делится между чем? И почему? В вашем случае вы должны использовать EntityManager с временем жизни, ограниченным одной транзакцией ( контекст персистентности в области транзакций ). Другими словами, не делитесь им (и не беспокойтесь об открытии и закрытии его для каждого запроса, это не дорогая операция).

Ссылки

  • JPA 2.0 Спецификация
    • Раздел 7.6 «Контексты управляемости контейнером»
    • Раздел 7.6.1 «Контекст сохраняемости в управляемой контейнером транзакции»
    • Раздел 7.6.2 «Расширенный контекст сохраняемости, управляемый контейнером»

Ресурсы

0 голосов
/ 27 апреля 2013
...