2016-12-22 2 views
1

Я новичок в Spring MVC & Boot. Я могу открыть http://localhost:8088/postList, но при ошибке http://localhost:8088/post/1 я испытываю ошибку страницы ошибки Whitelabel. Я не могу найти свою ошибку. Вы можете это сказать?Spring MVC возвращает 404 из-за неправильного имени представления InternalResourceViewResolver

Моя структура проекта

enter image description here

Мой InternalResourceViewer:

@Bean 
public InternalResourceViewResolver viewResolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
    resolver.setPrefix("WEB-INF/views/"); 
    resolver.setSuffix(".jsp"); 
    return resolver; 
} 

Мой контроллер:

@Controller 
@RequestMapping("/") 
public class PostController 
{ 

@Autowired 
PostService postService; 

@RequestMapping(value="/post/{id}", method=RequestMethod.GET) 
public ModelAndView list(@PathVariable("id") int id){ 

    ModelAndView mav=new ModelAndView("post"); 

    Post postItem=postService.getPostById(id); 
    mav.addObject("postItem",postItem); 

    mav.addObject("postItem",postItem); 

    return mav; 
} 

@RequestMapping(value="/postList", method=RequestMethod.GET) 
public ModelAndView postlist(){ 

    ModelAndView mav=new ModelAndView("postList"); 
    mav.addObject("postList",postService.listPosts()); 

    return mav; 
} 


} 

Мой PostList:

enter image description here

Мои сообщения страница просмотра:

enter image description here

Мои postList.jsp и содержание библиотеки тегов:

<div class="row"> 

     <c:if test="${not empty postList}"> 
      <c:forEach var="postItem" items="${postList}"> 
       <div class="col-lg-8"> 

        <h1><a href="<c:url value='/post/${postItem.id}' />">${postItem.header}</a></h1> 

        <p class="lead"> 
         by <a href="#">${postItem.user_id}</a> 
        </p> 

        <p><span class="glyphicon glyphicon-time"></span>${postItem.upddate}</p> 

        <hr> 
       </div> 
      </c:forEach> 
     </c:if> 
+0

Покажите нам содержимое 'postList.jsp' со ссылками. –

ответ

1

Короткий ответ является то, что вам нужно ведущий / в вашем префиксе InternalResourceViewResolver. Так

resolver.setPrefix("/WEB-INF/views/"); 

Длинный ответ, что Spring MVC использует InternalResourceViewResolver для создания View, в этом случае JstlView. Spring MVC затем пытается отобразить этот View.

Для этого он использует имя вида (префикс, имя в вашем ModelView, и суффикс, то есть. WEB-INF/views/post.jsp), как путь, и пытается извлечь RequestDispatcher путем делегирования ServletRequest#getRequestDispatcher(String).

Имя пути может быть указано относительное, хотя он не может распространяться за пределы текущего контекста сервлета. Если путь начинается с "/", он интерпретируется как относительно текущего корня контекста. Этот метод возвращает null, если контейнер сервлета не может вернуть RequestDispatcher.

Поскольку у вас нет ведущего /, это относительно текущего пути, т.е. /post/1. Это делает его /post/WEB-INF/views/post.jsp. И поскольку у вас нет такого ресурса относительно ServletContext, ваш контейнер Servlet возвращает значение 404.

+0

Как я пропустил это. Большое спасибо Сотириосу. Это решение, когда я добавил в "/" головку префикса. – user2400092