Настройка смешанной конфигурации для контроллеров Spring MVC на основе аннотаций - PullRequest
5 голосов
/ 07 декабря 2010

У меня есть несколько контроллеров с различными обработчиками запросов в моем проекте Spring 3.x (все на основе аннотаций с использованием @Controller и @RequestMapping).

В настоящее время контекст приложения просто определяет DefaultAnnotationHandlerMapping и AnnotationMethodHandlerAdapter бобы.Если я правильно понимаю, их также можно заменить на <mvc:annotation-driven/>.
. Существующие контроллеры в основном заполняют модель, которая передается через параметры, а затем возвращают имя представления в виде строки.Отображение выполняется стандартными DefaultRequestToViewNameTranslator и InternalResourceViewResolver bean-компонентами.

Теперь я хотел бы представить новый контроллер, для которого необходимы HttpMessageConverter (это будет MappingJacksonHttpMessageConverter) и HandlerExceptionResolver специфичные для этого контроллера.

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


Существует ли способ сделать это без удаления конфигурации нового аннотации для нового контроллера?Есть ли способ настроить конвертер сообщений и определитель исключений специально для одного контроллера, не отказываясь от маршрутизации URL на основе @RequestMapping?

Или есть способ выбрать конфигурацию конвертера / распознавателя, используяаннотация на контроллере?

Если нет, каков следующий лучший подход для этого?

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Если вы аннотируете свой метод с помощью @ExceptionHandler, как указано здесь , он будет обрабатывать только те исключения, которые вызываются методами контроллера, в котором он размещен.Так что это не повлияет на другие.

Что касается HttpMessageConverter, я не уверен, что то, что я собираюсь сказать, может быть применено к HttpMessageConverter (потому что я никогда не использовал его, и я не уверен,если это можно рассматривать как другие конвертеры), но если вы можете создать с ним конверсионный сервис, вы можете сделать что-то подобное в контроллере:

@Autowired
private ConversionService conversionService;

@InitBinder
public void initBinder(WebDataBinder binder){
    binder.setConversionService(conversionService);
}

, и конверсионный сервис будет применяться только к методу контроллераэтот initBinder.

0 голосов
/ 08 декабря 2010

В особом случае, когда между контроллерами нет совпадений типов носителей (например, один принимает и отвечает только с JSON, все остальные получают / отвечают с XML), вы можете положиться на совпадение заголовков Content-Type и AcceptSpring, чтобы сделать сопоставление с соответствующим HttpMessageConverter для вас.

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

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