自定义Seam3国际化消息

时间:2012-03-26 22:49:40

标签: java jsf-2 internationalization seam cdi

我正在使用Seam 3国际化软件包在我的应用程序中实现消息传递。

简而言之,这就是我在做的事情:

导入/注入所需的类:

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

发生错误时,我在我的支持bean中创建了一条消息:

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

最后,我在脸部页面中显示消息,如下所示:

<h:messages />

到目前为止我认为非常标准......

我想要实现的自定义逻辑是能够首先检查数据库表(让我们调用此表MessageBundleOverride)以获得匹配的消息密钥。如果它存在,我想使用MessageBundleOverride表中的值而不是属性文件。如果它不存在或为空,我想使用属性文件中找到的值。

我认为有一种Weld / CDI方式可以实现这一点,我可以实现Messages接口并以某种方式将其注册到接口,以便它在“注入”期间获取我的消息实现,而不是默认的MessagesImpl实现与Seam国际化包。我对Seam / Weld来说有点新鲜,所以不确定这是否是一件简单的事情。

非常感谢任何帮助, 谢谢!

1 个答案:

答案 0 :(得分: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>

只要焊接正在拾取MyMessages定义的包中的类,就应该这样做。