2012-03-26 11 views
1

私はSeam 3国際化パッケージを使用してアプリケーションでメッセージングを実装しています。Seam3国際化メッセージのカスタマイズ

を必要なクラス注入/インポート:要するに

が、これは私がやっているものです

messages.error(new BundleKey("AppMsgResources", "errorMsgKey")).defaults("Error: Something bad happened!"); 
:エラーが発生した場合

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

を、私は私のバッキングBeanでのメッセージを作成します

最後に、私の顔のページにメッセージを表示します。

<h:messages /> 
これまでのところ、私は考えて非常に標準

...

私が実装するカスタム・ロジックは、最初にデータベーステーブルをチェックできるようにすることです、一致するメッセージキーのために(この表のMessageBundleOverrideを呼び出すことができます)。存在する場合は、プロパティファイルではなくMessageBundleOverrideテーブルの値を使用します。存在しないか空であれば、プロパティファイルにある値を使用します。

メッセージインターフェイスを実装してシームに登録することができるWeld/CDIの方法があると思っています。これは、メッセージインプリメンテーションを「注入」の間に選択し、デフォルトのMessagesImpl実装ではなくSeam Internationalizationパッケージが付属しています。私はSeam/Weldに少し新しくなっているので、これが簡単なことなのかどうかは分かりません。

お手数ですが、 ありがとうございます!

答えて

1

が、これは溶接ドキュメントを読んだ後に行わばかりの片道考え出し:beans.xmlファイルで 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 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が定義されているパッケージのクラスを取得している限り、それはそうする必要があります。