2013-04-16 65 views
5

Tôi chắc chắn đây là câu hỏi noob và tôi đã dành phần lớn hơn một giờ để có câu trả lời nhưng không ai có trường hợp của tôi ở đây go ...Trộn REST và JSP trong Spring MVC, Không thể tìm thấy JSP

Tôi có một ứng dụng web mới sử dụng Spring MVC. Hầu hết ứng dụng (99%) là REST thuần túy, vì vậy nó không có "dạng xem" như vậy mà chỉ gửi JSON trở lại dây hoặc gửi một Trạng thái HTTP thay thế cho các lỗi, v.v.

Ngoại lệ là trang đăng nhập cần phải là một JSP thực tế, nhưng bằng cách nào đó cấu hình tôi đang sử dụng để ánh xạ các trình điều khiển REST của tôi đang để lại cho tôi trong một trạng thái mà các ánh xạ JSP bình thường không thành công.

Đây là những gì tôi đã có:

Trong cấu hình servlet phối của tôi, các phần có liên quan bao gồm:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/pages/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

Trong nỗ lực của tôi để làm cho nó làm việc, tôi cũng đã thêm một ánh xạ đến " HomeController" mà hiện nay chỉ chuyển hướng đến JSP đăng nhập của tôi:

<bean name="/" class="com.somepackage.HomeController"/> 

Bây giờ, trong web.xml tôi có:

<servlet> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring-dispatcher-servlet.xml 
    </param-value> 
</context-param> 

này hoạt động tốt cho các bộ điều khiển của tôi RESTful, mà trông như thế này:

@Controller 
@RequestMapping(value = "/api/user") 
public class BlahBlahController {... 

của tôi "HomeController", mà chỉ trông như thế này:

@Controller 
@RequestMapping(value = "/") 
public class HomeController extends AbstractController { 
    @Override 
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 
     return new ModelAndView("login"); 
    } 
} 

được kích hoạt khi tôi nhấn phím "/"url, nhưng tôi gặp lỗi này trong nhật ký:

WARNING: No mapping found for HTTP request with URI [/WEB-INF/pages/login.jsp] in DispatcherServlet with name 'spring-dispatcher' 

Bây giờ tôi hiểu ý nghĩa của nó, nó không biết làm thế nào để giải quyết /WEB-INF/pages/login.jsp (trang này không tồn tại btw), nhưng tôi bị mắc kẹt như thế nào tôi cần phải thay đổi mọi thứ để có được điều này để làm việc.

Tôi hơi bối rối về cách thức hoạt động của nó. Có ai có manh mối nào không?

Cảm ơn.

+0

Tôi không chắc chắn nếu nó quan trọng, nhưng tại sao bạn đã xác định resolver xem hai lần? Ngoài ra, 'HomeController' của bạn được chú thích bằng' @ Component' thay vì '@ Controller'. – NilsH

+0

Oh .. lol .. vâng bản sao là một sai lầm .. không quan trọng như bạn đã nói. Sự phân biệt @ Component/@ Controller được phát hiện tốt, tôi sẽ thay đổi hơn bây giờ và thử lại. (Bài chỉnh sửa để xóa các lỗi này khi sự cố vẫn còn) –

+0

Vì vậy, không có Tôi nhận được lỗi sau: Không tìm thấy bản đồ nào cho HTTP yêu cầu với URI [/] trong ... Với ánh xạ tôi nhận được cùng một lỗi như trước: Không tìm thấy ánh xạ cho yêu cầu HTTP với URI [/WEB-INF/pages/login.jsp] trong ... Tôi ghét có cấu hình xml đó .. Tôi muốn mọi thứ được chú thích điều khiển nhưng bất kể nó vẫn không hoạt động cho tôi –

Trả lời

6

OK .. Tôi đã tìm thấy câu trả lời, đó là mẫu url trong cấu hình trình điều phối.

Thay vì:

<servlet-mapping> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Nó phải là

<servlet-mapping> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

tôi đã thực sự tìm thấy câu trả lời này ở nơi khác và thử nó nhưng "nghĩ" nó không được làm việc, sau đó nhận ra lý do tôi nghĩ điều này không liên quan đến nguyên nhân gốc rễ.

Không có ý tưởng tại sao điều này có thể làm việc và người kia sẽ không .. nhưng có một vấn đề tại một thời điểm ...

-1

Đặt RequestMapping ở cấp phương thức, tôi đã thử ở mã của mình và nó hoạt động. Bạn không cần phải xác định đậu HomeController nếu bạn đang sử dụng @Controller và có một thích hợp "bối cảnh: thành phần quét"

@Override 
@RequestMapping(value = "/") 
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 
    return new ModelAndView("login"); 
} 

bạn cũng có thể sử dụng dưới mã nếu bạn chỉ muốn chuyển hướng một cái nhìn đăng nhập cho tất cả "/" truy cập.

<mvc:view-controller path="/" view-name="login"/> 

Thanh toán dự án mvc show case từ github để tham khảo hữu ích.

+0

Như tôi đã đề cập trong các nhận xét trước, vấn đề không phải là bộ điều khiển không được tìm thấy, nó là và nó cháy. Vấn đề là JSP nó chuyển tiếp đến không thể được tìm thấy. Không tìm thấy ánh xạ nào cho yêu cầu HTTP với URI [/WEB-INF/pages/login.jsp] trong DispatcherServlet –

+0

Vâng, bạn đã sửa đổi mẫu url mà tôi đã bỏ lỡ. bạn có thể đánh giá cao tính dễ sử dụng của mùa xuân bằng cách thêm bạn không cần viết bất kỳ bộ điều khiển nào – apurvc

+0

Cảm ơn bạn đã biết mẹo. Bộ điều khiển trong bài viết chỉ là một ví dụ. Có nhiều mã hơn ở đó nhưng tôi nghĩ rằng điều quan trọng là phải thể hiện các điều kiện chính xác trong đó vấn đề đã xảy ra. Tôi sử dụng phần tử view-controller ở nơi khác và tôi đồng ý rằng nó thực sự rất hữu ích. –

Các vấn đề liên quan