Приносим извинения, если на это ответят в другом месте, но некоторые обширные поисковые запросы на сайте не принесли ничего, что помогло мне до сих пор, поэтому я собираюсь спросить здесь.Spring MVC Controller вызывается, но получает визуализацию 404
Итак, у меня есть приложение Spring MVC, которое я пытаюсь наметить с помощью аннотаций, и хотя для некоторых запросов он отлично работает, для других я получаю 404 даже после вызова контроллера.
Итак, вот моя установка ...
web.xml:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>requiredVariableFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>requiredVariableFilter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>requiredVariableFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Мои appServlet-servlet.xml:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
Мой контроллер. Это довольно просто сейчас:
@Controller
@RequestMapping("/user")
public class UserController {
static Logger log = Logger.getLogger(UserController.class);
@Autowired
private UserService userService;
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getBaseUserInfo(HttpServletRequest request, HttpServletResponse response) {
log.info("got into the user controller");
ModelAndView mav = new ModelAndView("user/baseinfo");
User user = this.userService.getCurrentUser();
mav.addObject("user", user);
log.info("passing off to view");
return mav;
}
}
Я могу заверить вас, что у меня есть соответствующие JSP в /WEB-INF/pages/user/baseinfo.jsp, так что это не то, что JSP не существует.
Кроме того, мое ведение журнала показывает, что сообщения журнала в контроллере запускаются, поэтому он доходит до того, что возвращает вид, а затем Tomcat дает мне оху-довольно 404 страницу, и мои журналы говорят только, что/пользователь возвращает 404.
в качестве альтернативы, однако, у меня есть еще один контроллер, который работает прекрасно здесь:
@Controller
public class BaseController {
static Logger log = Logger.getLogger(BaseController.class);
@Autowired
private UserService userService;
@Autowired
private MailChimpService mailChimpService;
@RequestMapping(value="/", method=RequestMethod.GET)
public ModelAndView getHomePage(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = new ModelAndView("index");
User user = this.userService.getCurrentUser();
mav.addObject("welcomeMessage", "Hey There!");
if(user != null) {
mav.addObject("user", user);
}
mav.addObject("newsBlasts", this.mailChimpService.getEmailBlasts());
return mav;
}
@RequestMapping(value="/login")
public ModelAndView getLoginPage (HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value="error", required=false, defaultValue=StringUtils.EMPTY) String error) {
ModelAndView mav = new ModelAndView("login");
SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
if(StringUtils.isNotEmpty(error)) {
mav.addObject("badLogin", true);
}
mav.addObject("returnUrl", savedRequest.getRedirectUrl());
return mav;
}
}
Оба методов этого возвращения контроллера прекрасно и sitemeshed вверх и все, что с не проблемы. Я пробовал много разных предложений, которые я видел на этом сайте, и пока ничего похожего не делает трюк.
Единственная разница между тем, как я обрабатываю эти контроллеры, состоит в том, что первый из них в конечном итоге будет иметь вложенные @ RequestMapping, поэтому он будет обрабатывать что-либо под шаблоном/user (/ user/edit,/user/throwparty и т. Д.).), тогда как второй контроллер просто обрабатывает одноразовые URL-адреса, которые специально не привязаны к определенному набору функциональных возможностей (в данном случае домашняя страница и страница входа).
У кого-нибудь есть предложения?
Не может быть проблема с sitemesh для обработки представлений в подкаталогах? –
@SergeBallesta Я думал об этом, но когда я перемещаю файл обратно в тот же каталог, что и другие представления, он по-прежнему не работает там, поэтому я не думаю, что это так. Я также (просто чтобы проверить это) переместил мой index.jsp в папку/pages/user, изменил имя представления, и он работал как ожидалось (то есть, он работал). – RGThigpen
Ну тогда похоже, что проблема в самом представлении ... Как она отличается от других (которые работают)? –