2013-03-09 95 views
3

我有一個servlet的context.xml的彈簧MVC應用程序:春季爲messageSource工作在JSP和JUnit測試不工作

<?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" /> 

我在WEB-INF只有兩個.properties文件/ I18N /文件夾:

WEB-INF/I18N/application.properties中

WEB-INF/I18N/validation_messages.properties

爲messageSource工作正常,在JSP頁面中:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 
<fmt:message key="validation.User.NULL_FIRST_NAME"/> 

和Hibernate驗證:

@Entity 
@Table(name="users") 
public class User { 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "id", unique = true, nullable = false) 
private Long id; 

@Column(name="first_name") 
@NotNull(message = "{validation.User.NULL_FIRST_NAME}") 
@Size(max = 255, message = "{validation.User.TOO_LONG_FIRST_NAME}") 
private String firstName; 

//... getters and setters 
} 

不過,這並不在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) 

任何想法?

+0

您是否正在使用java config和xml config的混合? – 2013-03-09 09:30:00

+0

是的。我認爲這是配置這種類型的應用程序的常用方法。 – 2013-03-09 10:02:39

回答

3

你試圖在Locale對象傳遞null值。請嘗試使用默認語言環境代替:

Locale locale = Locale.getDefault(); 
User_NULL_FIRST_NAME = messageSource.getMessage("validation.User.NULL_FIRST_NAME", null, locale); 

但這不是唯一的原因。看起來,spring-servlet.xml上下文的路徑不同於JUnit上下文。

所以對於JUnit測試你需要改變basenames語言環境弄成這個樣子:

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

對於統一春servlet配置和JUnit測試中,我會建議移動信息包(即i18n文件夾)到resources Maven的文件夾,用classpath:前綴訪問它。因此,在這兩種情況下,它看起來像以下:

<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" 
     id="messageSource" 
     p:basenames="classpath:i18n/application, classpath:i18n/validation_messages" 
     /> 
+0

我已經嘗試過不同種類的語言環境。剛試過你的變種。同樣的故事,仍然錯誤。 – 2013-03-09 10:15:08

+0

請檢查更新的答案 – n1ckolas 2013-03-09 10:34:07

+0

這聽起來像是真的。謝謝。 – 2013-03-09 10:58:56

1

你在JPATestConfig.class配置了爲messageSource? 您可以使用此配置進行測試。

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

是的,我想補充的ApplicationContext(從servlet的context.xml的配置)在jpaTestConfig – 2013-03-09 10:48:09

+0

嘗試定義你的基本名稱爲類路徑號碼:基本名稱=「類路徑:國際化/ validation_messages ... – 2013-03-09 10:55:47

+0

剛回到職場你是對的,我在jpaTestConfig中連接錯誤的xml-config。謝謝你的回答。 – 2013-03-09 17:39:08