我阅读的每个文档和示例都是关于验证表单字段,但我希望为其他情况显示消息,例如警告视图或流程已更改。因此,必须在操作方法上添加这些消息。
在我的情况下,应用程序向用户发送确认电子邮件,在流程上有一个决策状态,根据已声明请求参数的链接重定向到视图。然后我定义一个动作状态,评估一种方法来确认电子邮件或警告用户有关帐户的状态(已删除或已启用)
<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,但我真的迷失了这个问题。
答案 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}" />