为一般用途添加spring webflow动态消息(没有验证表单)?

时间:2014-07-31 16:58:27

标签: spring spring-mvc spring-webflow

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

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

<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)在flow文件夹上添加messages.properties或创建MessageSource bean,但我真的迷失了这个问题。

2 个答案:

答案 0 :(得分:2)

我相信你没有正确使用classpath中的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}"/>

答案 1 :(得分:0)

我在这个post中找到了Spring,JSF 2.2和i18的解决方案。基本上,您应该定义一个spring消息源并创建一个将为jsf outputtext标记调用的spring组件。那么@Prasad如何编写在弹簧流中或以编程方式设置密钥所必需的。

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

MessageSource Bean

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

     return msg;
 }

Spring组件

@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}" />