我正在使用Spring Web Flow 2.0.7,并且刚刚开始设置我的单元测试。我有自己的flows目录,其中包含类路径上的flow xml文件和messages.properties文件。
它加载得很好,但是它似乎没有自动拾取流的messages.properties文件,因此我的验证单元测试失败了,因为它不能解析给定代码的消息。
下面是异常的相关部分:
org.springframework.context.NoSuchMessageException: No message found under code 'error_alnum_char_count_not_atleast' for locale 'en_US'.
这似乎是一个相当常见的场景,使用messages.properties中解析的代码来生成错误消息。那么,加载messages.properties文件的推荐方式是什么呢?
发布于 2011-11-21 09:18:16
我知道这个问题有多老了,但在找到解决方案后,我想我应该把它发布给其他人:
Object obj = builderContext.getApplicationContext()
.getBean(AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME);
obj = builderContext.getApplicationContext().getBean(AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME);
if (obj != null && obj instanceof StaticMessageSource) {
StaticMessageSource messageSource = (StaticMessageSource) obj;
messageSource.setUseCodeAsDefaultMessage(true);
}
放在configureFlowBuilderContext方法中的上述代码将把所有消息解析为代码本身。这不能正确解决您的消息,但将防止您列出的失败,并允许您的测试通过。
如果有更好的方法,我真的很想听一听,因为这真的只是一个变通办法。
发布于 2015-05-12 16:25:52
我必须创建一个在自定义web流校验器中使用的ValidationContext
。我使用反射解决了问题
protected MessageSource validationMessages;
/**
* Creates a validationContext
* We have to use reflection because there's no way to set
the messageSource inside {@link MockRequestContext} otherwise
*
* @return {@link ValidationContext}
* @throws IllegalAccessException
* @throws NoSuchFieldException
*/
protected ValidationContext getValidationContext() throws IllegalAccessException, NoSuchFieldException {
final MockRequestContext requestContext = new MockRequestContext();
requestContext.setExternalContext(context);
final DefaultMessageContext defaultMessageContext = new DefaultMessageContext(validationMessages);
final Field messageContextField = MockRequestContext.class.getDeclaredField("messageContext");
final boolean accessible = messageContextField.isAccessible();
messageContextField.setAccessible(true);
messageContextField.set(requestContext, defaultMessageContext);
messageContextField.setAccessible(accessible);
return new DefaultValidationContext(requestContext, "validateInfo", mock(MappingResults.class));
}
https://stackoverflow.com/questions/972863
复制