Начав с нуля без каких-либо предварительных знаний о Джерси 1.x, мне трудно понять, как настроить внедрение зависимостей в моем проекте Джерси 2.0.
Я также понимаю, что HK2 доступен в Jersey 2.0, но я не могу найти документов, которые помогли бы с интеграцией Jersey 2.0.
@ManagedBean
@Path("myresource")
public class MyResource {
@Inject
MyService myService;
/**
* Method handling HTTP GET requests. The returned object will be sent
* to the client as "text/plain" media type.
*
* @return String that will be returned as a text/plain response.
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/getit")
public String getIt() {
return "Got it {" + myService + "}";
}
}
@Resource
@ManagedBean
public class MyService {
void serviceCall() {
System.out.print("Service calls");
}
}
pom.xml
<properties>
<jersey.version>2.0-rc1</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jax-rs-ri</artifactId>
</dependency>
</dependencies>
Я могу запустить контейнер и обслуживать мой ресурс, но как только я добавляю @Inject в MyService, фреймворк выдает исключение:
SEVERE: Servlet.service() for servlet [com.noip.MyApplication] in context with path [/jaxrs] threw exception [A MultiException has 3 exceptions. They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MyService,parent=MyResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1039471128)
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.noip.MyResource errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on com.noip.MyResource
] with root cause
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MyService,parent=MyResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1039471128)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
Мой стартовый проект доступен на GitHub: https://github.com/donaldjarmstrong/jaxrs
источник
EntityManager
такое, но судя по docs.oracle.com/javaee/6/api/javax/persistence/… похоже, это интерфейс. Вы можете связать его с помощьюbind(EntityManagerImpl.class).to(EntityManager.class)
(который будет связывать класс ,EntityManagerImpl
реализующий интерфейсEntityManager
. Если вам нужно использовать завод, взглянуть наbindFactory()
вAbstractBinder
. Если вам нужна помощь с этим, пожалуйста , создайте новый вопрос (я не буду иметь комнату ответьте на него в комментариях). Кроме того, я не уверен, что вам следует использовать @PersistentContext, просто используйте @Inject для всего,Сначала просто чтобы ответить на комментарий в ответе принимает.
Он просто читает
bind( implementation ).to( contract )
. Можно альтернативную цепочку.in( scope )
. Объем по умолчаниюPerLookup
. Итак, если вам нужен синглтон, вы можетеТакже есть
RequestScoped
доступныйКроме того, вместо
bind(Class).to(Class)
, вы также можетеbind(Instance).to(Class)
, который автоматически будет синглтоном.Добавление к принятому ответу
Для тех, кто пытается выяснить, как зарегистрировать вашу
AbstractBinder
реализацию в вашем web.xml (т.е. вы не используете aResourceConfig
), кажется, что связыватель не будет обнаружен при сканировании пакетов, т.е.Или это либо
Чтобы заставить его работать, мне пришлось реализовать
Feature
:@Provider
Аннотаций должен позволитьFeature
быть подобрано сканированием пакета. Или без сканирования пакетов вы можете явно зарегистрироватьFeature
вweb.xml
Смотрите также:
и для получения общей информации из документации Джерси
ОБНОВИТЬ
Заводы
Помимо базовой привязки в принятом ответе, у вас также есть фабрики, где вы можете иметь более сложную логику создания, а также иметь доступ для запроса контекстной информации. Например
Затем вы можете ввести
MyService
в свой класс ресурсов.источник
web.xml
даже при вызовеconfigure()
onHk2Feature
, при запросе ресурса генерируетсяNullPointerException
. @PaulSamsothaВыбранный ответ датирован давным-давно. Объявлять каждую привязку в настраиваемом подшивке HK2 нецелесообразно. Я использую Tomcat, и мне просто нужно было добавить одну зависимость. Несмотря на то, что он был разработан для Glassfish, он идеально подходит для других контейнеров.
Убедитесь, что ваш контейнер также правильно настроен ( см. Документацию ).
источник
Поздно, но я надеюсь, что это кому-то поможет.
Мой JAX RS определен следующим образом:
Затем, наконец, в свой код я могу ввести:
В моем случае
SomeManagedBean
это bean-компонент ApplicationScoped.Надеюсь, это кому-нибудь поможет.
источник
Oracle рекомендует добавлять аннотацию @Path ко всем типам, которые будут внедряться при объединении JAX-RS с CDI: http://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm Хотя это далеко не идеально ( например, при запуске вы получите предупреждение от Джерси), я решил пойти по этому пути, что избавляет меня от необходимости поддерживать все поддерживаемые типы в привязке.
Пример:
источник
Если вы предпочитаете использовать Guice и не хотите объявлять все привязки, вы также можете попробовать этот адаптер:
Guice-Bridge-jit-инжектор
источник
Для меня это работает без использования,
AbstractBinder
если я включу следующие зависимости в свое веб-приложение (работающее на Tomcat 8.5, Jersey 2.27):У меня он работает с CDI 1.2 / CDI 2.0 (с использованием Weld 2/3 соответственно).
источник
Зависимость, необходимая для спокойного обслуживания трикотажа, а Tomcat - это сервер. где $ {jersey.version} - 2.29.1
Базовый код будет следующим:
источник