Spring 3 - простые несвязанные отображения URL-адресов с отображением на основе аннотаций - невозможно? - PullRequest
4 голосов
/ 11 марта 2010

Я использую Spring 3 и пытаюсь настроить простое веб-приложение, используя аннотации для определения отображений контроллера. Это кажется невероятно трудным без добавления всех URL-адресов с помощью * .form или * .do

.

Поскольку часть сайта должна быть защищена паролем, все эти URL-адреса находятся в папке / secure. В файле web.xml есть <security-constraint>, защищающий все под этим корнем. Я хочу отобразить все контроллеры Spring в / secure / app /.

Примеры URL будут:
/ Обеспечения / приложение / LandingPage
/ Безопасный / приложение / редактировать / клиент / {идентификатор}
каждый из которых я бы обработал с соответствующим jsp / xml / чем угодно.

Итак, в web.xml у меня есть это:

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

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/secure/app/*</url-pattern>
</servlet-mapping>

И в despatcher-servlet.xml у меня есть это:

 <context:component-scan base-package="controller" />

В пакете Controller у меня есть класс контроллера:

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/secure/app/main")
public class HomePageController {
    public HomePageController() { }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getPage(HttpServletRequest request)
    {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("main");
        return mav;
    }
}

В / WEB-INF / jsp у меня есть "main.jsp", и для этого указывается подходящий преобразователь вида. У меня все работало при отображении диспетчера с использованием * .form, но я не могу заставить что-либо работать с использованием приведенного выше кода.

Когда запускается Spring, кажется, что все отображается правильно:

13:22:36,762  INFO main annotation.DefaultAnnotationHandlerMapping:399 - Mapped URL path [/secure/app/main] onto handler [controller.HomePageController@2a8ab08f]

Я также заметил эту строку, которая выглядела подозрительно:

13:25:49,578 DEBUG main servlet.DispatcherServlet:443 - No HandlerMappings found in servlet 'dispatcher': using default

И во время выполнения любая попытка просмотра / secure / app / main просто возвращает ошибку 404 в Tomcat с таким выводом журнала:

13:25:53,382 DEBUG http-8080-1 servlet.DispatcherServlet:842 - DispatcherServlet with name 'dispatcher' determining Last-Modified value for [/secure/app/main]    
13:25:53,383 DEBUG http-8080-1 servlet.DispatcherServlet:850 - No handler found in getLastModified    
13:25:53,390 DEBUG http-8080-1 servlet.DispatcherServlet:690 - DispatcherServlet with name 'dispatcher' processing GET request for [/secure/app/main]    
13:25:53,393  WARN http-8080-1 servlet.PageNotFound:962 - No mapping found for HTTP request with URI [/secure/app/main] in DispatcherServlet with name 'dispatcher'    
13:25:53,393 DEBUG http-8080-1 servlet.DispatcherServlet:677 - Successfully completed request

Итак ... Spring сопоставляет URL, а затем "забывает" об этом сопоставлении через секунду? Что происходит?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 21 марта 2010

У меня точно такая же проблема, как и у вас. Способ установить AlwaysUseFullPath довольно прост. Мой файл настроек выглядит следующим образом:

<bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
    p:order="3" > <!-- a higher value meaning greater in terms of sorting.  -->
    <property name="alwaysUseFullPath" value="true" />
    <property name="interceptors">
        <list>
            <ref local="myInterceptor" />
        </list>
    </property>
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="alwaysUseFullPath" value="true" />
</bean>
2 голосов
/ 11 марта 2010

Ах. Как обычно, нашел ответ после размещения вопроса: -)

Изменение аннотации RequestMapping на just / main решает проблему. В документации не очень понятно, как все это указано.

0 голосов
/ 16 августа 2010

Поместите что-то вроде этого в свой класс @Configuration:

@Bean(autowire = Autowire.BY_TYPE)
public AnnotationMethodHandlerAdapter handlerAdapter(){
final AnnotationMethodHandlerAdapter annotationMethodHandlerAdapter = new AnnotationMethodHandlerAdapter();
annotationMethodHandlerAdapter.setAlwaysUseFullPath(true);
return annotationMethodHandlerAdapter;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...