Spring MVC RequestMapping соответствует неверному URL - PullRequest
3 голосов
/ 13 мая 2011

Я строю остальные API для одного веб-приложения и столкнулся с проблемой с RequestMapping.

В основном есть пользователи, которые сгруппированы в разные домены.Когда они работают с системой, некоторая информация сохраняется в объекте с именем 'session' и записывается в БД.

У меня есть следующие URL:

1) http://server.com/api/v1/domain/domainName/sessions - показываетинформация обо всех сеансах для всех пользователей в домене.

2) http://server.com/api/v1/domain/domainName/user/userName/sessions - показать информацию о сеансах конкретного пользователя.

Я использую Spring 3.0.5 и имеюобъявил 2 обработчика в моем классе контроллера:

@RequestMapping(value = "/{domainId}/sessions", method=RequestMethod.GET)
public void findSessions(@PathVariable final String domainId) {
   ...
}

@RequestMapping(value = "/{domainId}/user/{username}/sessions", method=RequestMethod.GET)
public void findUserSessions(
        @PathVariable final String domainId,
        @PathVariable final String username) {
   ...
}

Я использую смешанные сопоставления контроллера: SimpleUrlHandlerMapping + Annotations

Базовый путь для контроллера указывается с помощью SimpleUrlHandlerMapping:

<property name="mappings">
    <value>
    /api/v1/domain/** = api.DomainsController
    </value>
</property>

Проблема в том, что оба URL обрабатываются первым методом.Для URL 2 имя пользователя связано с domainId pathvariable, таким образом, логика метода торможения.

Но, если я укажу полный путь в отображении запроса - он будет работать нормально.

@RequestMapping(value = "/api/v1/domain/{domainId}/sessions", method=RequestMethod.GET)
@RequestMapping(value = "/api/v1/domain/{domainId}/user/{username}/sessions", method=RequestMethod.GET)

1 Ответ

1 голос
/ 13 мая 2011

Я думаю, что было бы лучше не смешивать методологии SimpleUriHandlerMapping и RequestMapping.Я не думаю, что они предназначены для совместной работы.

Я думаю, что вы хотели бы просто RequestMapping уровня класса для / api / v1 / domain и затем отображения уровня метода для отдельных случаев.

Итак, другими словами, удалите запись SimpleUrlHandlerMapping и сделайте это вместо этого:

@Controller
@RequestMapping(value = "/api/v1/domain")
public class DomainsController {

@RequestMapping(value = "/{domainId}/sessions", method=RequestMethod.GET)
public void findSessions(@PathVariable final String domainId) {
   ...
}

@RequestMapping(value = "/{domainId}/user/{username}/sessions", method=RequestMethod.GET)
public void findUserSessions(
        @PathVariable final String domainId,
        @PathVariable final String username) {
   ...
}

}

Это говорит Spring, что этот контроллер отвечает за все запросы, начиная с / api / v1 / domain, а затемсопоставления запросов уровня метода относятся к этому.

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