2

我正在使用 Spring Web Flow 2.0.7,并且刚刚开始设置我的单元测试。我有我的流目录,在我的类路径中包含流 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 文件的推荐方法是什么?

4

2 回答 2

2

我知道这个问题有多老了,但是找到了一个解决方案,我想我会把它发布给其他人:

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 方法中,会将所有消息解析为代码本身。这不会正确解析您的消息,但会防止您列出的失败并允许您的测试通过。

如果有更好的方法,我真的很想听听它,因为这实际上只是一种解决方法。

于 2011-11-21T09:18:15.750 回答
0

我必须创建一个ValidationContext在自定义 Web 流验证器中使用。我用反射解决了

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));
}
于 2015-05-12T16:25:52.233 回答