2016-08-30 2 views
1

Я просто новый в технологии Spring Framework, и я делаю сайт с несколькими WebServices (веб-сайт, сайт в социальных сетях и т. Д.). Что я хочу для этого, так это то, что каждый веб-сервис будет иметь DispatcherServlet с собственным ViewResolver. Таким образом, структура моих проектов выглядит следующим образом:.Multi DispatcherServlets в Spring MVC (Java Config)

  • Главный сайт - DispatcherServlet # 1 отображение только в http://example.com (да, я знаю, я мог бы просто использовать статический HTML сайт, но это для целей обучения
  • Webservice нет. 1, например, Webstore - DispatcherServlet # 2 отображение только /Webstore/*
  • Webservice no.2 например Социальные медиа сайт - DispatcherServlet # 3 отображение только/социальный/*

в конфигурации Я использую Java Классы, так что я сделал:

  • Во-первых, я создал класс, который расширяет AppConfig WebMvcConfigureAdapter и реализует ViewResolver для основных взглядов сайта. Затем я создал класс AppInitializer, который расширяет класс AbstractAnnotationConfigDispatcherServletInitializer, и внутри него я настроил отображение RootConfigClass и сервлетов
  • Во-вторых, у меня была проблема - а именно, я не мог создать другой класс для диспетчера Servlet # 2 (cann ' t имеют два класса, которые расширили AbstractAnnotationConfigDispatcherServletInitializer), то, что я нашел, это создание класса, который реализует интерфейс WebApplicationInitializer. Что я сделал и, наконец, работал Второй DispatcherServlet
  • В-третьих, я повторно выполнил шаги со второй точки и имел три рабочих диспетчерских сервлета (в теории ...).

    1. Я мог бы получить доступ к своему основному сайту через DispatcherServlet # 1
      (http://example.com)

    2. Я мог бы получить доступ к моей Webstore основного сайта через DispatcherServlet # 2 (http://example.com/webstore)

    3. и я мог бы получить доступ к мой веб-сервис через DispatcherServlet # 3 (http://example.com/social)

но в конце концов, когда я создал другое представление, например, для входа в раздел (http://example.com/webstore/login) Это не сработало. Ошибки говорят, что Диспетчерский сервлет # 1 не смог обработать запрос сопоставления, где адрес должен быть привязан к диспетчеру Servlet # 2. То, что я сделал для решения этой проблемы, заключалось в изменении класса конфигурации диспетчера сервлета № 2 в отношении отображения сервлета от servlet.addMapping("/webstore/"); до servlet.addMapping("/webstore/*");, который я прочитал, это не лучшая идея, но она сработала. Проблема возникает, когда я набираю адрес, который контроллер не обрабатывает (не существует), как (http://example.com/webstore/thisaddressdoesntexists), контроллер вида возвращает мне основной вид по умолчанию от http://example.com/webstore, а не 404 не найденную страницу. Это не то поведение, которое я намерен реализовать. Помимо этой небольшой «функции», все работает отлично. Весь specyfic запрос обслуживается с их specyfic DispatcherServlet.Ответы на финнал:

  • Как предотвратить загрузку изображения по умолчанию, в этом случае, когда я указываю на несуществующие URL-адреса и сайты с кодом ошибки загрузки?
  • Является ли моя концепция даже хорошей? Я имею в виду использование классов, которые реализуют WebApplicationInitializer для использования большего количества DispatcherServlets или есть другой способ? Я говорю только о Java-конфигурационных классах, не xmls.

ответ

1

Является ли моя концепция даже хорошей? Я имею в виду использование классов, которые реализуют WebApplicationInitializer для использования большего количества DispatcherServlets или там - это еще один способ? Я говорю только о Java-Based Config Classes, no xmls.

Для нескольких сервлет вам нужно иметь один класс, который реализует WebApplicationInitializer и там обеспечить класс ContextLoader со всеми бобами для корневого контекста и определить отдельный класс со всеми бобами для каждого сервлета (usualliy класса, который расширяет WebAppConfigurer). Вам также необходимо предоставить сопоставление для каждого отдельного сервлета. Посмотрите here, как это сделано в примере (последние 2 ответов)

Что касается до

Is my concept even good at all? 

Почему вы хотите иметь три отдельных сервлетов? Связаны ли эти три разных приложения вместе? Если это так, я бы не поместил их в один и тот же пакет, а сделал три 3 разных приложения. Вы также можете использовать один Dispatchetservlet, который сопоставляется каждому URL-адресу и имеет отдельные контроллеры для каждого компонента. Это уменьшит сложность всего проекта. Так может быть и в любом случае. Не зная больше о том, что вы пытаетесь сделать, никто не может сказать, что это правильно или неправильно.

Как предотвратить погрузочной просмотра по умолчанию, в этом случае сценарий, когда я указываю на несуществующих сайтах код ошибки URL-адреса и нагрузки?

Для получения информации об ошибках смотрите here. Обычно вы используете @ResponseStatus для определенного кода ошибки HTTP или @ExceptionHandler для общей ошибки. В обоих случаях вам нужно будет перенаправить на страницу ошибок по умолчанию.