Java SpringMessageSource在JSP中工作,而在jUnit测试中不工作

Java SpringMessageSource在JSP中工作,而在jUnit测试中不工作,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有一个带有servlet-context.xml的spring MVC应用程序: <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org

我有一个带有servlet-context.xml的spring MVC应用程序:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.1.xsd
    ">

<annotation-driven validator="validator"/>

<resources mapping="/resources/**" location="/resources/" />

<default-servlet-handler/>  

<!-- Apache Tails configuration -->
<beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" id="tilesViewResolver">
    <beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
</beans:bean>

<beans:bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer" id="tilesConfigurer">
    <beans:property name="definitions">
        <beans:list>
            <beans:value>/WEB-INF/layouts/layouts.xml</beans:value>
            <beans:value>/WEB-INF/views/**/views.xml</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>


<interceptors>
    <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="lang"/>
</interceptors> 

<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
            id="messageSource"
            p:basenames="WEB-INF/i18n/application, WEB-INF/i18n/validation_messages"
            />
<beans:bean class="org.springframework.web.servlet.i18n.CookieLocaleResolver"
            id="localeResolver"
            p:cookieName="locale"/>

<beans:bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <beans:property name="validationMessageSource" ref="messageSource"/>
</beans:bean>

<context:component-scan base-package="com.myapp.mvc" />
但它在jUnit测试类中不起作用:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {JPATestConfig.class})
public class AbstractJpaTest {

@Inject
private MessageSource messageSource;

public void fillValidationMessages() {
Locale locale = null;
User_NULL_FIRST_NAME = messageSource.getMessage("validation.User.NULL_FIRST_NAME", null, locale);
}
}
我尝试使用MessageSourceAware和不同的语言环境,但每次都出现相同的错误:

org.springframework.context.NoSuchMessageException: No message found under code 'validation.User.NULL_FIRST_NAME' for locale 'null'.
at org.springframework.context.support.DelegatingMessageSource.getMessage(DelegatingMessageSource.java:65)
at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:1234)
at com.dominform.mvc.AbstractJpaTest.fillValidationMessages(AbstractJpaTest.java:198)
at com.dominform.mvc.jpa_tests.UserUtilTest.init(UserUtilTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

有什么想法吗?

您试图在
Locale
对象中传递
null
值。请尝试改用默认区域设置:

Locale locale = Locale.getDefault();
User_NULL_FIRST_NAME = messageSource.getMessage("validation.User.NULL_FIRST_NAME", null, locale);
但这不是唯一的原因。看起来,
springservlet.xml
context的路径与JUnit上下文不同

因此,对于JUnit测试,您需要将
basenames
locales更改为如下内容:

<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
        id="messageSource"
        p:basenames="file:src/main/webapp/WEB-INF/i18n/application, file:src/main/webapp/WEB-INF/i18n/validation_messages"
        />

您是否在JPATestConfig.class中配置了messageSource? 您可以使用此配置运行测试

@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/servlet-context.xml})"

您是否混合使用java配置和xml配置?是的。我认为这是配置这类应用程序的常用方法。我已经尝试了不同的区域设置。刚试过你的变种。同样的故事,还是错误。是的,我只是检查一下。这是正确答案的很大一部分。第二部分——在jpaTestConfig类中,我连接了错误的xml配置,但没有连接servlet-context.xml。非常感谢您的帮助。是的,我在jpaTestConfig中添加了ApplicationContext(从servlet context.xml配置),尝试将您的基本名称定义为classpath p:basenames=“classpath:i18n/validation\u消息…返回到workplace。您是对的,我在jpaTestConfig中连接了错误的xml配置。谢谢您的回答。
<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
        id="messageSource"
        p:basenames="file:src/main/webapp/WEB-INF/i18n/application, file:src/main/webapp/WEB-INF/i18n/validation_messages"
        />
<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
        id="messageSource"
        p:basenames="classpath:i18n/application, classpath:i18n/validation_messages"
        />
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/servlet-context.xml})"