java-Spring messageSource在JSP中工作,而在jUnit测试中不工作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-Spring messageSource在JSP中工作,而在jUnit测试中不工作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7313字,纯文字阅读大概需要11分钟。
内容图文
![java-Spring messageSource在JSP中工作,而在jUnit测试中不工作](/upload/InfoBanner/zyjiaocheng/677/584a068c51fc41ffba9e57c66fd75527.jpg)
我有一个带有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" />
我在WEB-INF / i18n /文件夹中只有两个.properties文件:
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)
有任何想法吗?
解决方法:
您正在尝试在Locale对象中传递null值.请尝试改用默认语言环境:
Locale locale = Locale.getDefault();
User_NULL_FIRST_NAME = messageSource.getMessage("validation.User.NULL_FIRST_NAME", null, locale);
但这不是唯一的原因.看来spring-servlet.xml上下文的路径不同于JUnit上下文.
因此,对于JUnit测试,您需要将基本名称的语言环境更改为如下所示:
<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"
/>
为了统一Spring Servlet Config和JUnit测试,我建议将消息??束(即i18n文件夹)移到资源maven的文件夹中,并使用classpath:前缀访问它.因此,在两种情况下,它都将如下所示:
<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
id="messageSource"
p:basenames="classpath:i18n/application, classpath:i18n/validation_messages"
/>
内容总结
以上是互联网集市为您收集整理的java-Spring messageSource在JSP中工作,而在jUnit测试中不工作全部内容,希望文章能够帮你解决java-Spring messageSource在JSP中工作,而在jUnit测试中不工作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。