Джерси, Grizzly Server, HK2 Инъекция зависимостей: я хочу ввести DAO [duplicate]

Вы пытались решить проблему с клейкой лентой?

Попробуйте определить, когда возникают ошибки, и исправьте их короткими операторами if, это не очень, но для некоторых проблем это единственное решение, и это один из них .

 if( (n * 0.1) < 100.0 ) { return n * 0.1 - 0.000000000000001 ;}
                    else { return n * 0.1 + 0.000000000000001 ;}    

У меня была такая же проблема в проекте научной симуляции в c #, и я могу сказать вам, что если вы проигнорируете эффект бабочки, он превратится в большого толстого дракона и укусит вас в a **

93
задан Paul Samsotha 19 February 2016 в 01:51
поделиться

6 ответов

Вам необходимо определить AbstractBinder и зарегистрировать его в приложении JAX-RS. Связывание определяет, как инъекция зависимости должна создавать ваши классы.

public class MyApplicationBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(MyService.class).to(MyService.class);
    }
}

Когда @Inject обнаружен в параметре или поле типа MyService.class, он создается с использованием класса MyService. Чтобы использовать это связующее, его необходимо зарегистрировать в приложении JAX-RS. В web.xml определите приложение JAX-RS следующим образом:

<servlet>
  <servlet-name>MyApplication</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value>com.mypackage.MyApplication</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>MyApplication</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

Внесите класс MyApplication (указанный выше в init-param).

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new MyApplicationBinder());
        packages(true, "com.mypackage.rest");
    }
}

В конструкторе класса, указанном в конструкторе класса, записывается вставка, определяющая вложение зависимостей, а также приложение, в котором вы можете найти ресурсы REST (в вашем случае MyResource) с помощью вызова метода packages().

92
ответ дан mkobit 25 August 2018 в 05:49
поделиться

Oracle рекомендует добавить аннотацию @Path ко всем типам, которые будут вставляться при объединении JAX-RS с CDI: http://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm Хотя это далеко не идеально (например, вы получите предупреждение от Джерси при запуске), я решил воспользоваться этим путем, что избавит меня от поддержки всех поддерживаемых типов в связующем.

Пример:

@Singleton
@Path("singleton-configuration-service")
public class ConfigurationService {
  .. 
}

@Path("my-path")
class MyProvider {
  @Inject ConfigurationService _configuration;

  @GET
  public Object get() {..}
}
2
ответ дан Benjamin Mesing 25 August 2018 в 05:49
поделиться

Если вы предпочитаете использовать Guice, и вы не хотите объявлять все привязки, вы также можете попробовать этот адаптер:

guice-bridge-jit-injector

0
ответ дан Choi 25 August 2018 в 05:49
поделиться

Поздно, но я надеюсь, что это кому-то поможет.

У меня есть JAX RS, определенный следующим образом:

@Path("/examplepath")
@RequestScoped //this make the diference
public class ExampleResource {

Затем, в моем коде, наконец, я могу ввести:

@Inject
SomeManagedBean bean;

В моем случае SomeManagedBean является компонентом ApplicationScoped.

Надеюсь, это поможет кому угодно.

5
ответ дан gjijon 25 August 2018 в 05:49
поделиться

Сначала просто ответьте на комментарий в ответе accept.

«Что делает привязка? Что делать, если у меня есть интерфейс и реализация?»

Он просто читает bind( implementation ).to( contract ). Вы можете использовать альтернативную цепочку .in( scope ). Область по умолчанию PerLookup. Поэтому, если вам нужен синглтон, вы можете

bind( implementation ).to( contract ).in( Singleton.class );

Также имеется RequestScoped

Кроме того, вместо bind(Class).to(Class) вы также можете bind(Instance).to(Class), который будет быть автоматически одиночным.


Добавление к принятому ответу

Для тех, кто пытается выяснить, как зарегистрировать реализацию AbstractBinder в ваш web.xml (т. е. вы не используете ResourceConfig), похоже, связывание не будет обнаружено через сканирование пакетов, то есть

<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>
        your.packages.to.scan
    </param-value>
</init-param>

Или это либо

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        com.foo.YourBinderImpl
    </param-value>
</init-param>

Чтобы заставить его работать, мне пришлось реализовать Feature :

import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.Provider;

@Provider
public class Hk2Feature implements Feature {

    @Override
    public boolean configure(FeatureContext context) {
        context.register(new AppBinder());
        return true;
    }
}

Аннотации @Provider должны позволять выбирать Feature путем сканирования пакета. Или без сканирования пакетов вы можете явно зарегистрировать Feature в web.xml

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>
            com.foo.Hk2Feature
        </param-value>
    </init-param>
    ...
    <load-on-startup>1</load-on-startup>
</servlet>

См. Также:

и для общей информации из документации Джерси


UPDATE

Заводы

от базовой привязки в принятом ответе, у вас также есть заводы, где вы можете иметь более сложную логику создания, а также иметь доступ к информации контекста запроса. Например

public class MyServiceFactory implements Factory<MyService> {
    @Context
    private HttpHeaders headers;

    @Override
    public MyService provide() {
        return new MyService(headers.getHeaderString("X-Header"));
    }

    @Override
    public void dispose(MyService service) { /* noop */ }
}

register(new AbstractBinder() {
    @Override
    public void configure() {
        bindFactory(MyServiceFactory.class).to(MyService.class)
                .in(RequestScoped.class);
    }
});

Затем вы можете ввести MyService в свой класс ресурсов.

44
ответ дан Graham 25 August 2018 в 05:49
поделиться

Выбранный ответ датируется некоторое время назад. Нецелесообразно объявлять каждую привязку в обычном связующем HK2. Я использую Tomcat, и мне просто нужно добавить одну зависимость. Несмотря на то, что он был разработан для Glassfish, он идеально вписывается в другие контейнеры.

   <dependency>
        <groupId>org.glassfish.jersey.containers.glassfish</groupId>
        <artifactId>jersey-gf-cdi</artifactId>
        <version>${jersey.version}</version>
    </dependency>

Убедитесь, что ваш контейнер правильно настроен ( см. документацию ).

11
ответ дан otonglet 25 August 2018 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: