【问题标题】:Adding spring webflow dynamic messages for general purposes (no validating forms)?为一般目的添加spring webflow动态消息(无验证表单)?
【发布时间】:2014-09-23 17:53:52
【问题描述】:

我阅读的每个文档和示例都是关于验证表单字段的,但我希望显示其他情况的消息,例如警告视图或流程已更改。因此,必须将消息添加到操作方法中。

在我的情况下,应用程序向用户发送一封确认电子邮件,在流程中有一个决策状态,根据链接是否声明为请求参数而重定向到视图。然后我定义了一个动作状态,它评估一种方法来确认向用户发送有关帐户状态(已删除或已启用)的电子邮件或警告

<on-start>
    <set name="requestScope.code" value="requestParameters.code" />
    <set name="requestScope.ln" value="requestParameters.ln" />
</on-start> 

<decision-state id="checkConfirmation">
    <if test="requestScope.code==null" then="login" else="confirmation" />
</decision-state>

<action-state id="confirmation">
    <evaluate expression="login.confirmation(requestScope.ln,requestScope.code)" />
    <transition on="yes" to="confirmationOk" />
    <transition on="noUserFound" to="noUserFound" />
    <transition on="userEnabled" to="userEnabled" />
    <transition on="error" to="error" />
</action-state>

<view-state id="userEnabled" view="confirmation.xhtml">
   <on-entry>
        <set name="viewScope.operation" value="'enabled'" />
   </on-entry>

    <transition on="login" to="login" />
</view-state>

确认方式

    public String confirmation(String language,String emailCode){
    logger.entry("Login.confirmation()");

    String emailDecode=new String(Base64.decode(emailCode.getBytes()));

    User user=userBo.getDao().findNamedQueryUnique("getUserByEmail",emailDecode);

    if(user!=null){
        if(!user.isEnabled()){
            user.setEnabled(true);
            try{
                userBo.getDao().merge(user);

                if(!EmailProvider.sendEmailEnabled(language,emailDecode)){
                    return "error";
                }
            }catch(DataAccessException e){
                e.printStackTrace();
                FlashMessages.addMessage(language,"es.project.properties.message.msg","unexpected.exception");
                return "error";
            }
        }else{
            // JSF way - FlashMessages.addMessage(language,"es.project.properties.message.msg","user.enable.confirmation");

             //Spring webflow way - MessageContext context=new DefaultMessageContext();
            //MessageBuilder builder=new MessageBuilder();
            //context.addMessage(builder.code("user.enable.confirmation").build());


            **********************************************************
            *** I wish to add messages here and show in next view ****
            **********************************************************

            return "userEnabled";
        }
    }else{
        //FlashMessages.addMessage(language,"es.project.properties.message.msg","user.validation.norfound.exception");
        return "noUserFound";
    }
    return "yes";
}

我尝试按照 spring webflow 示例(booking-faces 和 booking-mvc)在流文件夹中添加 messages.properties 或创建 MessageSource bean,但我真的迷失了这个问题。

【问题讨论】:

    标签: spring spring-mvc spring-webflow


    【解决方案1】:

    我相信你没有正确地在类路径中拥有 messages.properties。 假设您的文件的文件夹结构为:

      src
       |
       |-resources
            |
            |-messages.properties
    

    即确保它在类路径中。

    您需要在 servlet 上下文 xml 文件中使用属性文件将 ResourceBundleMessageSource 声明为:

        <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basename" value="messages" />
        </bean>
    

    然后您可以通过以下方式访问属性:

        <action-state id="confirmation">
            ...
            <transition on="userEnabled" to="userEnabled">
                <!--This is the property you want to set in else part of confirmation method - instead include here-->
                <set name="flashScope.flashMessageKey" value="'es.project.properties.message.msg'" />
            </transition>
        </action-state>     
    

    将其包含在视图中:

        <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> 
    

    然后您可以通过以下方式在视图渲染中查看此消息:

        <fmt:message key="${flashMessageKey}"/>
    

    【讨论】:

    • 嗨@Prasad,您的解决方案是一个聪明的方法,但我认为它有一个障碍,JSF2.0 不支持 fmt taglib。我找到了一个混合 spring 消息源和 jsf 组件的解决方案。我会在下面写答案。无论如何,非常感谢你,因为设置密钥的想法解决了我的问题:)
    【解决方案2】:

    我在post 中找到了适用于 Spring、JSF 2.2 和 i18 的解决方案。基本上,您应该定义一个 spring 消息源并创建一个 spring 组件,该组件将为 jsf outputtext 标签调用。那么@Prasad 是如何写的,有必要在 spring 流中或以编程方式设置一个键。

    属性资源是 src/main/resources/error_en.propertiessrc/main/resources/error_es.properties

    消息源 Bean

     @Bean
     public ReloadableResourceBundleMessageSource messageSource(){
         ReloadableResourceBundleMessageSource msg=new ReloadableResourceBundleMessageSource();
         msg.setBasename("classpath*:error");
    
         return msg;
     }
    

    弹簧组件

    @Component(value="message")
    public class MessageSourceProvider extends HashMap {
    
    private static final long serialVersionUID = 1L;
    
     @Autowired
     private MessageSource messageSource;
    
     @Override
      public String get(Object key) {
       ServletRequest request = (ServletRequest) FacesContextWrapper.getCurrentInstance().getExternalContext().getRequest();
       String message;
            try {
                message = messageSource.getMessage((String) key, null, request.getLocale());
            }
            catch (NoSuchMessageException e) {
                message = "???" + key + "???";
            }
            return message;
        }
    }
    

    JSF 标记

    <h:outputText value="#{message.unexpected}" />
    

    【讨论】:

    • 然后我写了这个解决方案,我认为添加一个 JSF 资源包并在 Spring Flow 中设置密钥就足够了,因为这两种方式是相同的功能。
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 2013-09-18
    • 2012-08-24
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多