Выполните следующие действия:
tableView(_: numberOfRowsInSection:)
и tableview(_: cellForRowAtIndexPath:)
. Затем в последнем методе напишите: пусть myCell = tableView.dequeueReusableCellWithIdentifier («myCellID») как! MyTableViewCell возвращает myCell Несмотря на то, что мы не используем выходы для созданных вами текстовых полей, вам нужно будет в какой-то момент использовать их для предварительного заполнения контента, установки методов целевого действия, и др.
Вам необходимо определить 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()
.
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() {..}
}
Если вы предпочитаете использовать Guice, и вы не хотите объявлять все привязки, вы также можете попробовать этот адаптер:
Поздно, но я надеюсь, что это кому-то поможет.
У меня есть JAX RS, определенный следующим образом:
@Path("/examplepath")
@RequestScoped //this make the diference
public class ExampleResource {
Затем, в моем коде, наконец, я могу ввести:
@Inject
SomeManagedBean bean;
В моем случае SomeManagedBean
является компонентом ApplicationScoped.
Надеюсь, это поможет кому угодно.
Сначала просто ответьте на комментарий в ответе accept.
«Что делает привязка? Что делать, если у меня есть интерфейс и реализация?»
blockquote>Он просто читает
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>
См. Также:
- Пользовательский параметр метода [gg]
- Как правильно настроить EntityManager в jersey / hk2
- Запросить выделенную инъекцию в синглтоны
и для общей информации из документации Джерси
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
в свой класс ресурсов.
web.xml
, даже если вызывается configure()
на Hk2Feature
, запрос ресурса выбрасывает NullPointerException
. @PaulSamsotha
– Shamil
5 June 2018 в 07:03
Выбранный ответ датируется некоторое время назад. Нецелесообразно объявлять каждую привязку в обычном связующем HK2. Я использую Tomcat, и мне просто нужно добавить одну зависимость. Несмотря на то, что он был разработан для Glassfish, он идеально вписывается в другие контейнеры.
<dependency>
<groupId>org.glassfish.jersey.containers.glassfish</groupId>
<artifactId>jersey-gf-cdi</artifactId>
<version>${jersey.version}</version>
</dependency>
Убедитесь, что ваш контейнер правильно настроен ( см. документацию ).
EntityManager
, но, судя по docs.oracle.com/javaee/6/api/javax/persistence/… , он кажется интерфейсом. Вы можете связать его с помощьюbind(EntityManagerImpl.class).to(EntityManager.class)
(который привяжет классEntityManagerImpl
, реализующий интерфейсEntityManager
. Если вам нужно использовать фабрику, посмотритеbindFactory()
вAbstractBinder
. Если вам нужна помощь с это, пожалуйста, создайте новый вопрос (у меня не будет возможности ответить на него в комментариях). Кроме того, я не уверен, что вы должны использовать @PersistentContext, просто используйте @Inject для всего – joscarsson 25 June 2013 в 16:03