2012-05-15 1 views
0

Позвольте мне сначала объяснить настройки, которые у меня есть.Spring: как игнорировать RequestMappings, найденные в суперклассе контроллера?

Мое веб-приложение состоит из нескольких модулей, которые взаимосвязаны таким образом, что модуль 1 использует контроллеры/службы из модуля 2 для воссоздания общей функциональности и, следовательно, удаления избыточности кода. Поэтому просто добавьте два отдельных веб-приложения со всеми классами из 1 приложения, включенного в банку в другой.

Теперь вопрос, который я столкнулся из-за общих отображений URL в суб-модуля в соответствии со следующим сценарием:

контроллер А из модуля 1 расширяет контроллер B из модуля 2

package com.module1; 

@RequestMapping("/client") 
public class A extends B { 

    @RequestMapping("/hello") 
    public void helloWorldNew(...) { 
     ... 
    } 
} 



package com.module2; 

@RequestMapping("/user") 
public class B { 

    @RequestMapping("/") 
    public void helloWorld(...) { 
     ... 
    } 
} 

контроллер C от модуля 1 расширяет контроллер D от модуля 2

package com.module1; 

@RequestMapping("/client") 
public class C extends D { 

    @RequestMapping("/helloworld") 
    public void helloWorldNew(...) { 
     ... 
    } 
} 



package com.module2; 

@RequestMapping("/human") 
public class D { 

    @RequestMapping("/") 
    public void helloWorld(...) { 
     ... 
    } 
} 

Как вы можете видеть, с использованием модуля 2 отдельно URL, которые были отображены, являются /user/ & /client/, что является законным во всех смыслах. Теперь, когда модуль 1 входит в изображение, как и ожидалось, Spring выбрасывает исключение, указав, что URL /client/ уже отображен через A.helloWorld() и C.helloWorld() сопоставления.

Есть ли способ обойти это? Могу ли я попросить Spring просто игнорировать методы RequestMappings на уровне метода, найденные в суперклассе? Или есть способ, с помощью которого я могу взломать Spring, чтобы игнорировать/переопределять сопоставления (как это делали запросы RequestMappings на корневом уровне)?

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

Спасибо,
SUMIT

ответ

2

Я могу придумать несколько способов сделать это:

При настройке модуля 1, вы можете сделать компонент сканирования только для пакетов, которые имеют отношение к вам в модуле 1 (предполагается, что имена пакетов различны в модуле 1 и module2:

<context:component-scan base-package="package1, package2" use-default-filters="false"> 
</context:component-scan> 

если имена пакетов не очень отличаются, вы можете попробовать исключить по узору имени класса:

<context:exclude-filter type="regex" expression="*.Module1Class"/> 

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

Третий подход, если базовые классы не так важны для вас, может быть поставить @RequestMapping, который не конфликтует вообще с RequestMappings, которые определены для модуля 1.

+0

Благодаря Biju для ответа. Оказывается, мне нужны URL-адреса, которые отображаются в суперклассах, а также в модуле 1, и это не оставляет мне выбора, кроме как изменять URL-адреса !!! Тем не менее, отмечая ваш комментарий как ответ на правильность. – Sumit

Смежные вопросы