Menyesuaikan Pesan internasionalisasi Seam3

Saya menggunakan paket Internasionalisasi Seam 3 untuk mengimplementasikan perpesanan di aplikasi saya.

Singkatnya, inilah yang saya lakukan:

Mengimpor/Menyuntikkan kelas yang diperlukan:

import org.jboss.seam.international.status.Messages;
import javax.inject.Inject;
@Inject
private Messages messages;

Ketika terjadi kesalahan, saya membuat Pesan di backing bean saya:

messages.error(new BundleKey("AppMsgResources", "errorMsgKey")).defaults("Error: Something bad happened!");

Terakhir saya menampilkan pesan di halaman wajah saya seperti:

<h:messages />

Sangat standar sejauh ini menurut saya...

Logika khusus yang ingin saya terapkan adalah agar dapat memeriksa tabel database terlebih dahulu (sebut saja tabel ini MessageBundleOverride) untuk kunci pesan yang cocok. Jika ada, saya ingin menggunakan nilai dari tabel MessageBundleOverride dan bukan file properti. Jika tidak ada atau kosong, saya ingin menggunakan nilai yang ditemukan di file properti.

Saya berpikir ada cara Weld/CDI untuk melakukan ini di mana saya dapat mengimplementasikan antarmuka Pesan dan mendaftarkannya dengan jahitan sehingga dapat mengambil implementasi pesan saya selama "injeksi" dan bukan implementasi MessagesImpl default yang disertakan dengan Internasionalisasi Seam kemasan. Saya sedikit baru mengenal Seam / Weld jadi tidak yakin apakah ini hal yang mudah untuk dilakukan.

bantuan apa pun sangat dihargai, terima kasih!


person HenokG    schedule 26.03.2012    source sumber


Jawaban (1)


Menemukan salah satu cara untuk menyelesaikan ini setelah membaca dokumen Weld: http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#alternatives

@Alternative
@RequestScoped
public class MyMessages extends MessagesImpl {

/*
 * Override a method that you want to customize or write new code here
 */
@Override
public Set<Message> getAll() {
    Set<Message> allMessages = super.getAll();

    // do some custom logic here
    applyOverrides(allMessages);

    return allMessages;
}
...
// override any other method as needed 
// You will probably have to override everything so it probably 
// wouldnt make sense to extend the existing implementation)
...
}

Dalam file beans.xml, Anda harus mendeklarasikan kelas baru ini sebagai alternatif dari kelas default:

<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

    <alternatives>
        <class>com.company.project.view.messages.MyMessages</class>
    </alternatives>
</beans>

Dan itu akan berhasil selama weld mengambil kelas-kelas dalam paket tempat Anda mendefinisikan MyMessages.

person HenokG    schedule 27.03.2012