Memulai dari awal tanpa pengetahuan Jersey 1.x sebelumnya, saya mengalami kesulitan memahami cara mengatur injeksi ketergantungan di proyek Jersey 2.0 saya.
Saya juga memahami bahwa HK2 tersedia di Jersey 2.0, tetapi sepertinya saya tidak dapat menemukan dokumen yang membantu integrasi 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>
Saya bisa mendapatkan wadah untuk memulai dan menyajikan sumber daya saya, tetapi segera setelah saya menambahkan @Inject ke MyService, kerangka kerja mengeluarkan pengecualian:
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)
Proyek awal saya tersedia di GitHub: https://github.com/donaldjarmstrong/jaxrs
sumber
EntityManager
itu, tapi dilihat dari docs.oracle.com/javaee/6/api/javax/persistence/… sepertinya itu sebuah antarmuka. Anda dapat mengikat menggunakanbind(EntityManagerImpl.class).to(EntityManager.class)
(yang akan mengikat kelasEntityManagerImpl
mengimplementasikan antarmukaEntityManager
. Jika Anda perlu menggunakan sebuah pabrik, kita lihatbindFactory()
diAbstractBinder
. Jika Anda memerlukan bantuan dengan ini, silakan membuat pertanyaan baru (saya tidak akan memiliki ruang untuk jawab di komentar). Selain itu, saya tidak yakin Anda harus menggunakan @PersistentContext, cukup gunakan @Inject untuk semuanyaPertama, baru menjawab komentar di bagian penerima jawaban.
Itu hanya berbunyi
bind( implementation ).to( contract )
. Anda bisa rantai alternatif.in( scope )
. Cakupan defaultPerLookup
. Jadi jika Anda menginginkan seorang lajang, Anda bisaAda juga yang
RequestScoped
tersediaSelain itu, alih-alih
bind(Class).to(Class)
, Anda juga bisabind(Instance).to(Class)
, yang secara otomatis akan menjadi tunggal.Menambah jawaban yang diterima
Bagi mereka yang mencoba mencari cara untuk mendaftarkan
AbstractBinder
implementasi Anda di web.xml Anda (yaitu Anda tidak menggunakan aResourceConfig
), tampaknya pengikat tidak akan ditemukan melalui pemindaian paket, yaituAtau ini juga
Untuk membuatnya berfungsi, saya harus menerapkan
Feature
:The
@Provider
penjelasan harus memungkinkanFeature
untuk dijemput oleh scanning paket. Atau tanpa pemindaian paket, Anda dapat mendaftar secara eksplisitFeature
diweb.xml
Lihat juga:
dan untuk informasi umum dari dokumentasi Jersey
MEMPERBARUI
Pabrik
Selain pengikatan dasar dalam jawaban yang diterima, Anda juga memiliki pabrik, tempat Anda dapat memiliki logika pembuatan yang lebih kompleks, dan juga memiliki akses untuk meminta informasi konteks. Sebagai contoh
Kemudian Anda dapat menyuntikkan
MyService
ke kelas sumber daya Anda.sumber
web.xml
meskipunconfigure()
onHk2Feature
dipanggil, meminta resource akan menampilkan fileNullPointerException
. @PaulSamsothaJawaban yang dipilih berasal dari beberapa waktu yang lalu. Tidaklah praktis untuk mendeklarasikan setiap pengikatan dalam pengikat HK2 kustom. Saya menggunakan Tomcat dan saya hanya perlu menambahkan satu ketergantungan. Meskipun dirancang untuk Glassfish, ia sangat cocok dengan wadah lain.
Pastikan penampung Anda juga dikonfigurasi dengan benar ( lihat dokumentasi ).
sumber
Terlambat tapi saya harap ini membantu seseorang.
Saya memiliki JAX RS saya yang didefinisikan seperti ini:
Kemudian, dalam kode saya akhirnya saya bisa menyuntikkan:
Dalam kasus saya, itu
SomeManagedBean
adalah kacang ApplicationScoped.Semoga ini bisa membantu siapa pun.
sumber
Oracle merekomendasikan untuk menambahkan anotasi @Path ke semua jenis untuk dimasukkan saat menggabungkan JAX-RS dengan CDI: http://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm Meskipun ini jauh dari sempurna ( misalnya Anda akan mendapat peringatan dari Jersey saat memulai), saya memutuskan untuk mengambil rute ini, yang menyelamatkan saya dari mempertahankan semua jenis yang didukung dalam pengikat.
Contoh:
sumber
Jika Anda lebih suka menggunakan Guice dan tidak ingin mendeklarasikan semua binding, Anda juga dapat mencoba adaptor ini:
guice-bridge-jit-injector
sumber
Bagi saya ini berfungsi tanpa
AbstractBinder
jika saya menyertakan dependensi berikut dalam aplikasi web saya (berjalan di Tomcat 8.5, Jersey 2.27):Ia bekerja dengan CDI 1.2 / CDI 2.0 untuk saya (masing-masing menggunakan Weld 2/3).
sumber
Ketergantungan diperlukan untuk layanan jersey restful dan Tomcat adalah servernya. dengan $ {jersey.version} adalah 2.29.1
Kode dasarnya adalah sebagai berikut:
sumber