Spring Boot, MockMVC и MessageSource

Итак, вот очень простой проект с весенней загрузкой всего с 6 классами.

https://github.com/paranoiabla/spring-boot-mockmvc

Настройка довольно проста, и есть только один тестовый пример, который не работает. Исключение, которое я получаю, это

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.context.NoSuchMessageException: No message found under code 'custom.link' for locale 'en'.
at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:159)
at org.test.MyController.home(MyController.java:29)
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:606)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:177)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

И я верю, что это потому, что SpringApplicationContextLoader строка 255, метод addMockServletContext создает MockServletContext, вызывая конструктор, который принимает только путь. В результате внутри MockServletContext ResourceLoader инициализируется DefaultResourceLoader, который будет искать ресурсы в пути к классам. Таким образом, если у меня есть ReloadableResourceMessageResolver, а мои файлы свойств находятся в /WEB-INF/messages/base.properties, он никогда их не найдет, потому что /WEB-INF/messages/base.properties преобразуется в src/main/webapp/WEB-INF/messages/base.properties, который не найден в пути к классам с помощью ReloadableMessageSourceResolver. Я думаю, что при создании MockServletContext должна быть возможность явно передать FileSystemResourceLoader, верно?


person Petar Tahchiev    schedule 17.02.2015    source источник


Ответы (1)


Я думаю, WEN-INF должно быть WEB-INF

хотя я не проверял, это решает вашу проблему.

person Johnny Lim    schedule 04.03.2015
comment
Привет, Джонни, где ты видел WEN-INF - person Petar Tahchiev; 04.03.2015
comment
Извините, я видел это в коде - это была непреднамеренная опечатка только в этом проекте. Я изменил его, но даже с WEB-INF проблема остается. - person Petar Tahchiev; 04.03.2015