【问题标题】:Customizing Seam3 internationalization Messages自定义 Seam3 国际化消息
【发布时间】:2012-03-26 22:49:40
【问题描述】:

我正在使用 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 接口并以某种方式使用 seam 注册它,以便它在“注入”期间获取我的消息实现,而不是默认的 MessagesImpl 实现使用 Seam 国际化包。我对 Seam / Weld 有点陌生,所以不确定这是否是一件简单的事情。

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

【问题讨论】:

    标签: java jsf-2 internationalization seam cdi


    【解决方案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 的包中的类,就应该这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 2011-05-20
      • 2023-03-15
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多