JAX-RS: без сохранения состояния, синглтон, запутанная ошибка - PullRequest
0 голосов
/ 05 февраля 2019

Несколько раз я видел несколько способов настройки ресурса JAXRS.

Я имею в виду, иногда я вижу, что они помечены как @Singleton, @Stateless, @ApplicationScoped, @RequestScopedи даже без каких-либо аннотаций или использования их обоих.

  • javax.enterprise.context.RequestScoped
  • javax.enterprise.context.ApplicationScoped
  • javax.ejb.Stateless
  • javax.ejb.Singleton
  • javax.inject.Singleton

Какую аннотацию мне следует использовать?

Что имеет отношение javax.ejb к JAXRSресурс?

С другой стороны, я также хотел бы знать, как именно работать с аннотацией @Context.

Я имею в виду, я видел это применяется к параметру, также в поле класса .

@Path("entity")
public class EntityResource {

    @Context
    private Request request;

    @POST
    public Response create(Entity entity) {
        this.request...
    }

}

или

@Path("entity")
public class EntityResource {

    @POST
    public Response create(Entity entity, @Context Request request) {
        request...
    }

}

Как мне поступить?

Ответы [ 3 ]

0 голосов
/ 17 марта 2019

Нет необходимости использовать какие-либо аннотации EJB или CDI в классе ресурсов JAX-RS - если только вы не хотите использовать функции EJB или CDI в одном классе.

Если вы хотите внедрить любой компонент CDIв классы ресурсов, тогда класс ресурсов должен быть самим компонентом CDI, поэтому вы должны добавить аннотацию области видимости, предпочтительно @javax.enterprise.context.RequestScoped.

Если вы используете аннотацию EJB, такую ​​как @Stateless, внедрение также будет работать, поскольку EJB также являются компонентами CDI (но не наоборот).Однако bean-компоненты без состояния имеют другой жизненный цикл и по умолчанию являются транзакционными.

С другой стороны, если вам нужны транзакции, вы также можете использовать @javax.transaction.Transctional в сочетании с @RequestScoped и @Path.

Справочная информация:

EJB-компоненты немного устарели для большинства целей.Они появились первыми, до JAX-RS и CDI, но в наши дни CDI рассматривается как объединяющий механизм внедрения зависимостей в Java EE / Jakarta EE, и старые спецификации находятся в процессе обновления для более тесной интеграции с CDI.

0 голосов
/ 20 марта 2019

Использование @Stateless на ресурсе JAX-RS может быть полезно, чтобы веб-сервер не создавал новый ресурс для каждого вызова (как это делается с помощью аннотации @RequestScoped).При использовании аннотации @Stateless сервер создает пул ресурсов, который можно настраивать.Вы также получите выгоду от транзакций.

0 голосов
/ 05 февраля 2019

Что касается вашего первого вопроса (управляемая область действия bean-компонента), я бы сказал, что аннотацию области видимости не следует использовать, поскольку контейнер java-ee будет автоматически управлять правильной областью действия для вашего компонента в соответствии с аннотацией Jax-rs.

Однако ребята из ibm, похоже, имеют другое представление о вопросе и заявляют следующее

Лучшая практика

Добавление определенных областей жизненного цикла к любомуКлассы корневых ресурсов и провайдеров JAX-RS, которые существуют в вашем приложении, в архиве с поддержкой JCDI.Для классов ресурсов JAX-RS с аннотацией @ javax.ws.rs.Path вы можете использовать @ javax.enterprise.context.RequestScoped.Для подклассов javax.ws.rs.core.Application и аннотированных классов @ javax.ws.rs.ext.Provider необходимо использовать @ javax.enterprise.context.ApplicationScoped.

Что касается@Context аннотация используется для инъекции объектов, связанных с текущим http-запросом (список * здесь можно найти ), и вы можете использовать его как для полей экземпляра, так и для параметров метода

...