Один DispatcherServlet с несколькими контроллерами - PullRequest
0 голосов
/ 23 февраля 2010

Я пытаюсь создать несколько спокойных веб-сервисов, используя Spring MVC 3.0. В настоящее время у меня есть проблема, что только один из моих 2 контроллеров будет работать в любой момент времени. Как выясняется, любой класс, который будет первым при сортировке по алфавиту, будет работать правильно. Я получаю ошибку:

handleNoSuchRequestHandlingMethod Не найден соответствующий метод обработчика для запроса сервлета: путь '/polinq.xml', метод 'GET', карта параметров [[пусто]]

Ранее у меня тоже было очень похожее сообщение, за исключением того, что вместо пустой карты это было что-то вроде map [v -> String (array)]

Независимо от сообщения, в настоящее время LocationCovgController работает, а PolicyInquiryController - нет. Если я изменю изменение PolicyInquiryController на APolicyInquiryController, то он начнет функционировать должным образом, и LocationCovgController перестанет работать.

Любая помощь будет принята с благодарностью.

Большое спасибо, Джереми

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

Контроллер 1

package org.example;
@Controller
@RequestMapping(value = "/polinq.*")
public class PolicyInquiryController {

    @RequestMapping(value = "/polinq.*?comClientId={comClientId}")
    public ModelAndView getAccountSummary(
        @PathVariable("comClientId") String commercialClientId) {
        // setup of variable as was removed.
        ModelAndView mav = new ModelAndView("XmlView", 
            BindingResult.MODEL_KEY_PREFIX + "accsumm", as);
        return mav;
    }
}

Контроллер 2

package org.example;

@Controller
@RequestMapping(value = "/loccovginquiry.*")
public class LocationCovgController {
    @RequestMapping(value = "/loccovginquiry.*method={method}")
    public ModelAndView locationCovgInquiryByPolicyNo(
        @PathVariable("method")String method) {
        ModelAndView mav = new ModelAndView("XmlView",
            BindingResult.MODEL_KEY_PREFIX + "loccovg", covgs);
        return mav;
    }
}

Servlet Config

<context:component-scan base-package="org.example." />

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"     p:order="0">
  <property name="mediaTypes">
    <map>
      <entry key="atom" value="application/atom+xml"/>
      <entry key="xml" value="application/xml"/>
      <entry key="json" value="application/json"/>
      <entry key="html" value="text/html"/>
    </map>
   </property>

  <property name="defaultContentType" value="text/html"/>
  <property name="ignoreAcceptHeader" value="true"/>
  <property name="favorPathExtension" value="true"/>
  <property name="viewResolvers">
     <list>
         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
          </bean>
      </list>
   </property>
   <property name="defaultViews">
      <list>
        <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
      </list>
  </property>
</bean>

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />

<bean id="XmlView" class="org.springframework.web.servlet.view.xml.MarshallingView">
  <property name="marshaller" ref="marshaller"/>
</bean>

<oxm:jaxb2-marshaller id="marshaller">
  <oxm:class-to-be-bound name="org.example.policy.dto.AccountSummary"/>
  <oxm:class-to-be-bound name="org.example.policy.dto.InsuredName"/>
  <oxm:class-to-be-bound name="org.example.policy.dto.Producer"/>
  <oxm:class-to-be-bound name="org.example.policy.dto.PropertyLocCoverage"/>
  <oxm:class-to-be-bound name="org.example.policy.dto.PropertyLocCoverages"/>
</oxm:jaxb2-marshaller>

Ответы [ 3 ]

1 голос
/ 23 февраля 2010

Вы должны использовать @RequestParam вместо @PathVariable для привязки параметров запроса (то есть параметров, которые следуют после ?, вам также не нужно включать их в @RequestMapping).Кроме того, вам не нужно @RequestMapping на уровне класса для этой конфигурации:

Контроллер 1

package org.example;

@Controller
public class PolicyInquiryController {
    @RequestMapping(value = "/polinq")
    public ModelAndView getAccountSummary(
        @RequestParam("comClientId") String commercialClientId) {
        // setup of variable as was removed.
        ModelAndView mav = new ModelAndView("XmlView", 
            BindingResult.MODEL_KEY_PREFIX + "accsumm", as);
        return mav;
    }
}

Контроллер 2

package org.example;

@Controller
public class LocationCovgController {
    @RequestMapping(value = "/loccovginquiry")
    public ModelAndView locationCovgInquiryByPolicyNo(
        @RequestParam("method") String method) {
        ModelAndView mav = new ModelAndView("XmlView",
            BindingResult.MODEL_KEY_PREFIX + "loccovg", covgs);
        return mav;
    }
}
1 голос
/ 23 февраля 2010

Я вижу проблему с аннотациями на уровне класса, в вашем случае попробуйте удалить их и просто использовать аннотации на уровне метода. Также, если вы снова получили ошибку, пожалуйста, опубликуйте трассировку стека.

Также используйте RequestParam для получения значений параметров и PathVariable для доступа к переменным пути. Просто для URL \home\user\{username}\?p=rand, чтобы получить username, используйте pathvariable и используйте requestparam, чтобы получить p

0 голосов
/ 23 февраля 2010

Я остановился и запустил websphere, и код начал работать. Ранее я просто «опубликовал» изменения в webpshere или «очистил» проект в RAD (Rational Application Developer), и оказалось, что ни один из этих вариантов не полностью обновляет код на сервере. Прямо сейчас код работает 100% времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...