2015-09-19 5 views
1

На самом деле я пытаюсь получить доступ к моей полной службе отдыха на основе весны, я не настраиваю DispatcherServlet в web.xml, вместо этого я использую ContxtLoaderListener для загрузки моего конфигурационного файла весны.Доступ к службе весеннего отдыха без диспетчерского сервлета

Из моих журналов я вижу, что моя служба получает инициализацию, когда я когда-либо обращаюсь к указанному выше URL-адресу, ICallServlet получает запрос, поскольку он имеет url-шаблон как '/ *' (это я не могу изменить).

Здесь моя проблема в том, что я не смог получить доступ к моему сервису, запрос не доходит до моего обслуживания. без использования DispatcherServlet есть ли способ вызвать мой сервис отдыха, кто-то, пожалуйста, помогите мне решить эту проблему.

  • У меня есть контроллер отдыха:

    package mypackage; 
    @RestController 
    @RequestMapping("/api/casaOnboarding") 
    public class CasaOnboardingRestService { 
        @ResponseBody 
        @RequestMapping(value="/pwebXML", method=RequestMethod.POST, consumes={"application/json", "application/xml"}) 
        public ResponseEntity pwebXML(@RequestBody OnboardingReq onboardingReq, 
          HttpServletRequest request, HttpServletResponse response){ 
    System.out.println("Request Reached"); 
    ---- 
    } 
    } 
    
  • web.xml (Нет Dispatcher Servlet)

    <?xml version="1.0" encoding="UTF-8"?> 
    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath*:controllerServiceContext.xml</param-value> 
    </context-param> 
    <listener> 
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
        </listener> 
    <servlet> 
        <servlet-name>iCallUI</servlet-name> 
        <servlet-class>com.ui.ICallServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>iCallUI</servlet-name> 
        <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
    
  • controllerServiceContext.xml

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xmlns:p="http://www.springframework.org/schema/p" 
         xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 
         xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 
         xmlns:task="http://www.springframework.org/schema/task" 
         xsi:schemaLocation=" 
         http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd 
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd"> 
    
        <context:annotation-config /> 
        <context:component-scan base-package="mypackage"/> 
        <task:annotation-driven /> 
    </beans> 
    
  • Log File

    10:45:41,643 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] (ServerService Thread Pool -- 62) Creating shared instance of singleton bean 'casaOnboardingRestService' 
    10:45:41,643 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] (ServerService Thread Pool -- 62) Creating instance of bean 'casaOnboardingRestService' 
    10:45:41,643 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] (ServerService Thread Pool -- 62) Eagerly caching bean 'casaOnboardingRestService' to allow for resolving potential circular references 
    10:45:41,643 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] (ServerService Thread Pool -- 62) Finished creating instance of bean 'casaOnboardingRestService' 
    

URL: http://localhost:8080/icall-ui/api/casaOnboarding/pwebXML

ответ

1

Наконец я должен знать, что не существует никакого способа (как мне известно) о вызове пружинного отдыха услуги без использования DispatcherServlet.

Большое спасибо @Robert за ваши ценные предложения. Согласно комментариям @Robert, я изменил свой код, как показано ниже, чтобы заставить его работать.

  • web.xml

    <?xml version="1.0" encoding="UTF-8"?> 
    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath*:controllerServiceContext.xml</param-value> 
    </context-param> 
    <listener> 
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
        <servlet-name>iCallUI</servlet-name> 
        <servlet-class>com.ui.ICallServlet</servlet-class> 
    </servlet> 
    <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>/api/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
        <servlet-name>iCallUI</servlet-name> 
        <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
    
  • диспетчеру-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:p="http://www.springframework.org/schema/p" 
         xmlns:jee="http://www.springframework.org/schema/jee" 
         xmlns:tx="http://www.springframework.org/schema/tx" 
         xmlns:mvc="http://www.springframework.org/schema/mvc" 
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd 
         http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 
    
        <context:component-scan base-package="mypackage"/> 
        <mvc:annotation-driven /> 
    
    </beans> 
    
  • ControllerServiceContext.xml

Я удалил ниже строк кода и слева, как это со старыми кода (этот файл содержит некоторые другие материалы, связанные с проектом).

<context:component-scan base-package="mypackage"/> 
<task:annotation-driven /> 
  • Файл журнала

После просмотра ниже заявление, в журналах, я могу сказать моя служба готова обслуживать запросы.

15:12:01,782 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 58) Mapped "{[/api/casaOnboarding/pwebXML],methods=[POST],params=[],headers=[],consumes=[application/json || application/xml],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity mypackage.CasaOnboardingRestService.pwebXML(mypackage.OnboardingReq,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 
  • URL - я ниже URL для доступа к услуге

    http://localhost:8080/icall-ui/api/api/casaOnboarding/pwebXML 
    
4

Мне очень жаль, но вы не можете послать Spring MVC взгляды без Dispatcher Servlet. Ваш контекст будет загружен через ContextLoaderListener, но так же, как вы обнаружили, ваши маршруты никогда не будут вызваны.

Вы могли бы сделать что-то вроде отображения диспетчера сервлета к вашему API конечных точкам, а затем карта iCallUI поймать маршрут по умолчанию «/» в отличие от «/ *»:

<servlet-mapping> 
     <servlet-name>dispatcherServlet</servlet-name> 
     <url-pattern>/api/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>iCallUI</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

ICallServlet заменит сервлет по умолчанию и это может иметь или не иметь плохих эффектов в зависимости от того, как настроено ваше приложение. Например, статическая подача файлов может быть нарушена.

Подкласс org.springframework.web.servlet.DispatcherServlet - это опция. Но не зная, что вы делаете в com.ui.ICallServlet, кто знает, насколько сложно будет продлить DispatcherServlet.

Кроме того, это похоже на длинный путь. Если вы используете Spring для объявления своих маршрутов api, почему бы не использовать их, чтобы объявить их все? Почему есть два диспетчерских механизма? Если вам нужно выполнить некоторую предварительную обработку для каждого запроса, используйте фильтр сервлетов.

Наконец, и, возможно, самое простое решение. Просто укажите iCallUI на другой шаблон URL, например: «/ ui/*».

Это довольно сильно истощает возможности :). Хорошо, что и тот факт, что ваш файл controllerServiceContext не настроен для анализа URL-адресов. Вам также необходимо добавить

<mvc:annotation-driven /> 

Не забывайте всю информацию об имени пространства xml для этого!

xmlns:mvc="http://www.springframework.org/schema/mvc" 
    . 
    . 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    . 
+0

есть ли способ я могу выполните поведение DispatcherServlet с моим ICallServlet, добавив часть кода для пересылки запроса на мою услугу. – Uppicharla

+0

Если я использую DiapatcherServlet, то какой шаблон url мне нужно указать, так как ICallServlet использует url-шаблон '/ *', все запросы будут захвачены ICallServlet. Какой url-шаблон позволяет DispatcherServlet обрабатывать мой запрос. – Uppicharla

+0

Если нет явных требований, вы можете попробовать использовать Джерси. Это легко и просто. – user2004685

0

С помощью фильтра в web.xml

<!-- Spring security --> 
    <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> 
    </filter-mapping>