Saya baru saja mulai membaca Core JavaServer Faces, 3rd Ed. dan mereka mengatakan ini (penekanan dari saya):
Merupakan kecelakaan historis bahwa ada dua mekanisme terpisah, biji CDI dan biji yang dikelola JSF, untuk biji yang dapat digunakan di halaman JSF. Kami menyarankan Anda menggunakan kacang CDI kecuali jika aplikasi Anda harus bekerja pada pelari servlet biasa seperti Tomcat.
Mengapa? Mereka tidak memberikan pembenaran apa pun . Saya telah menggunakan @ManagedBean
untuk semua kacang dalam aplikasi prototipe yang berjalan di GlassFish 3, dan saya belum benar-benar memperhatikan masalah apa pun dengan ini. Saya tidak keberatan bermigrasi dari @ManagedBean
ke @Named
, tetapi saya ingin tahu mengapa saya harus repot .
jsf
jakarta-ee
jsf-2
cdi
Matt Ball
sumber
sumber
Jawaban:
CDI lebih disukai daripada JSF biasa karena CDI memungkinkan injeksi ketergantungan seluruh JavaEE. Anda juga dapat menyuntikkan POJO dan membiarkannya dikelola. Dengan JSF Anda hanya dapat menyuntikkan sebagian dari apa yang Anda bisa dengan CDI.
sumber
@ManagedBean
jika saya ingin menyuntikkannya dengan JSF?Gunakan CDI.
Sesuai JSF 2.3,
@ManagedBean
sudah tidak digunakan lagi . Lihat juga masalah spesifikasi 1417 . Ini berarti bahwa tidak ada lagi alasan untuk memilih@ManagedBean
lebih@Named
. Ini pertama kali diterapkan di Mojarra 2.3.0 versi beta m06.Sejarah
Perbedaan utamanya adalah,
@ManagedBean
dikelola oleh kerangka kerja JSF dan hanya@ManagedProperty
tersedia melalui biji yang dikelola JSF lainnya.@Named
dikelola oleh server aplikasi (wadah) melalui kerangka kerja CDI dan melalui@Inject
tersedia untuk setiap jenis wadah artefak dikelola seperti@WebListener
,@WebFilter
,@WebServlet
,@Path
,@Stateless
, dll dan bahkan JSF@ManagedBean
. Dari sisi lain,@ManagedProperty
tidak bukan bekerja di dalam@Named
atau wadah dikelola artefak lainnya. Ia bekerja hanya di dalam@ManagedBean
.Perbedaan lainnya adalah CDI sebenarnya menyuntikkan proxy yang didelegasikan ke instance saat ini dalam cakupan target berdasarkan per-permintaan / utas (seperti bagaimana EJB diinjeksi). Mekanisme ini memungkinkan penyuntikan kacang dari lingkup yang lebih sempit ke dalam kacang dengan cakupan yang lebih luas, yang tidak mungkin dilakukan dengan JSF
@ManagedProperty
. JSF "menyuntikkan" di sini contoh fisik secara langsung dengan memanggil penyetel (itu juga alasan mengapa penyetel diperlukan, sementara itu tidak diperlukan dengan@Inject
).Meskipun tidak secara langsung merugikan - ada cara lain - cakupannya
@ManagedBean
sangat terbatas. Dari perspektif lain, jika Anda tidak ingin mengekspos "terlalu banyak"@Inject
, Anda juga dapat menyimpan kacang yang Anda kelola@ManagedBean
. Ini sepertiprotected
versuspublic
. Tapi itu tidak dihitung.Setidaknya, di JSF 2.0 / 2.1, kelemahan utama dari mengelola kacang pendukung JSF oleh CDI adalah tidak adanya CDI yang setara
@ViewScoped
. The@ConversationScoped
datang dekat, tapi masih membutuhkan manual mulai dan berhenti dan menambahkan jelekcid
permintaan parameter untuk URL hasil. MyFaces CODI membuatnya lebih mudah dengan menjembatani JSFjavax.faces.bean.ViewScoped
ke CDI secara transparan sehingga Anda dapat melakukannya@Named @ViewScoped
, namun itu menambahkanwindowId
parameter permintaan yang jelek ke URL hasil, juga pada navigasi halaman-ke-halaman vanilla biasa. OmniFaces menyelesaikan ini semua dengan CDI sejati@ViewScoped
yang benar-benar mengikat ruang lingkup kacang ke status tampilan JSF alih-alih ke parameter permintaan arbitrer.JSF 2.2 (yang dirilis 3 tahun setelah pertanyaan / jawaban ini) menawarkan
@ViewScoped
anotasi baru yang kompatibel dengan CDI di luar kotak dalam bentukjavax.faces.view.ViewScoped
. JSF 2.2 bahkan hadir dengan CDI-only@FlowScoped
yang tidak memiliki@ManagedBean
padanan, dengan ini mendorong pengguna JSF ke CDI. Harapannya adalah bahwa@ManagedBean
dan teman-teman akan tidak digunakan lagi sesuai Java EE 8. Jika saat ini Anda masih menggunakan@ManagedBean
, oleh karena itu sangat disarankan untuk beralih ke CDI untuk bersiap untuk jalur peningkatan di masa mendatang. CDI sudah tersedia dalam wadah yang kompatibel dengan Profil Web Java EE, seperti WildFly, TomEE dan GlassFish. Untuk Tomcat, Anda harus menginstalnya secara terpisah, persis seperti yang Anda lakukan untuk JSF. Lihat juga Bagaimana cara menginstal CDI di Tomcat?sumber
beans.xml
, mengubah@ManagedBean
backing beans menjadi@Named
, dan mengubahnya@ManagedProperty
menjadi@Inject
. Semua baik-baik saja di dunia. Namun, jika saya mengubah@EJB
anotasi saya menjadi@Inject
, penerapan gagal (org.jboss.weld.exceptions.DeploymentException
) dengan pesanWELD-001408 Injection point has unsatisfied dependencies
. Haruskah saya benar-benar menggunakan@Inject
untuk menyuntikkan EJB tanpa antarmuka ke dalam@Named
kacang, atau haruskah saya tetap menggunakannya@EJB
? EJB dikemas dalam EJB JAR, EAR yang sama dengan WAR yang berisi kacang CDI saya.@Named
.@Named @ViewScoped
, namun hal itu menambahkan parameter permintaan windowId yang jelek ke URL hasil, juga pada navigasi halaman-ke-halaman vanilla biasa." Perhatikan bahwa dengan DeltaSpike, hal ini tidak berlaku lagi. Anda dapat menonaktifkan parameter URL dsId dan windowId, jika Anda tidak membutuhkan Window Scope.@ViewScoped
untuk JSF 2.0 / 2.1: showcase.omnifaces.org/cdi/ViewScopedDengan Java EE 6 dan CDI, Anda memiliki opsi berbeda untuk Managed Beans
@javax.faces.bean.ManagedBean
mengacu pada JSR 314 dan diperkenalkan dengan JSF 2.0. Tujuan utamanya adalah untuk menghindari konfigurasi di fileface-config.xml untuk menggunakan kacang di dalam Halaman JSF.@javax.annotation.ManagedBean(“myBean”)
didefinisikan oleh JSR 316. Ini menggeneralisasi kacang yang dikelola JSF untuk digunakan di tempat lain di Java EE@javax.inject.Named(“myBean”)
hampir sama, dengan yang di atas, kecuali Anda membutuhkan file beans.xml di folder web / WEB-INF untuk mengaktifkan CDI.sumber
beans.xml
file? Apakah ini masih berlaku sampai sekarang?Saya menggunakan CDI di GlassFish 3.0.1, tetapi untuk membuatnya bekerja saya harus mengimpor kerangka Seam 3 (Weld). Itu bekerja dengan cukup baik.
Di GlassFish 3.1 CDI berhenti bekerja, dan Seam Weld berhenti bekerja dengannya. Saya membuka bug tentang ini tetapi belum melihatnya diperbaiki. Saya harus mengonversi semua kode saya untuk menggunakan anotasi javax.faces. * Tetapi saya berencana untuk kembali ke CDI setelah mereka berhasil.
Saya setuju Anda harus menggunakan CDI, tetapi satu masalah yang belum saya selesaikan adalah apa yang harus dilakukan dengan anotasi @ViewScoped. Saya memiliki banyak kode yang bergantung padanya. Tidak jelas apakah @ViewScoped berfungsi jika Anda tidak menggunakan @ManagedBean dengannya. Jika ada yang bisa menjelaskan ini, saya akan sangat menghargainya.
sumber
Satu alasan bagus untuk pindah ke CDI: Anda dapat memiliki sumber daya cakupan sesi yang umum (misalnya profil pengguna)
@Inject
ke dalam kacang yang dikelola JSF dan layanan REST (yaitu, Jersey / JAX-RS).Di sisi lain,
@ViewScoped
adalah alasan kuat untuk tetap menggunakan JSF@ManagedBean
- terutama untuk apa pun dengan AJAX yang signifikan. Tidak ada pengganti standar untuk ini di CDI.Tampaknya itu mungkin memiliki beberapa dukungan untuk
@ViewScoped
anotasi -seperti untuk kacang CDI, tapi saya belum bermain dengannya secara pribadi.http://seamframework.org/Seam3/FacesModule
sumber