การปรับแต่งข้อความสากลของ Seam3

ฉันกำลังใช้แพ็คเกจ Seam 3 Internationalization เพื่อใช้งานการรับส่งข้อความในแอปพลิเคชันของฉัน

กล่าวโดยสรุปนี่คือสิ่งที่ฉันทำ:

การนำเข้า/การฉีดคลาสที่จำเป็น:

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

เมื่อมีข้อผิดพลาดเกิดขึ้น ฉันจะสร้างข้อความใน Backing Bean ของฉัน:

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

สุดท้ายนี้ ฉันแสดงข้อความในหน้าใบหน้าของฉันดังนี้:

<h:messages />

มาตรฐานมากจนถึงตอนนี้ฉันคิดว่า ...

ตรรกะที่กำหนดเองที่ฉันต้องการใช้คือสามารถตรวจสอบตารางฐานข้อมูลก่อน (ให้เรียกตารางนี้ MessageBundleOverride) เพื่อหาคีย์ข้อความที่ตรงกัน หากมีอยู่ ฉันต้องการใช้ค่าจากตาราง MessageBundleOverride ไม่ใช่ไฟล์คุณสมบัติ หากไม่มีอยู่หรือว่างเปล่า ฉันต้องการใช้ค่าที่พบในไฟล์คุณสมบัติ

ฉันคิดว่ามีวิธี Weld/CDI ในการทำเช่นนี้โดยที่ฉันสามารถใช้อินเทอร์เฟซ Messages และลงทะเบียนด้วยตะเข็บเพื่อให้รับการใช้งานข้อความของฉันในระหว่าง "ฉีด" และไม่ใช่การใช้งาน MessagesImpl เริ่มต้นที่มาพร้อมกับ Seam Internationalization บรรจุุภัณฑ์. ฉันยังใหม่กับ Seam / Weld นิดหน่อย เลยไม่แน่ใจว่านี่เป็นเรื่องง่ายที่จะทำหรือไม่

ความช่วยเหลือใด ๆ ที่ชื่นชมมากขอบคุณ!


person HenokG    schedule 26.03.2012    source แหล่งที่มา


คำตอบ (1)


ค้นพบวิธีหนึ่งในการดำเนินการนี้ให้สำเร็จหลังจากอ่านเอกสาร 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)
...
}

ในไฟล์ beans.xml คุณจะต้องประกาศคลาสใหม่นี้เป็นทางเลือกแทนค่าเริ่มต้น:

<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>

และนั่นควรทำตราบใดที่ weld กำลังรับคลาสในแพ็คเกจที่คุณกำหนด MyMessages

person HenokG    schedule 27.03.2012