Использование CDI + WS / RS + JPA для создания приложения

StackOverflow https://stackoverflow.com/questions/3744396

Вопрос

@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 включен:

  1. Суммарируется CDI, Life-Cycle управляемый Джерси. Аннотировать с @ManagedBean и необязательно аннотируют с аннотацией массы Джерси.

  2. создал и управляется 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top