2012-04-09 4 views
4

У меня есть приложение mvc (3.1.1) Spring, и я хочу определить условия, отличные от того, что доступно в RequestMapping. У меня есть несколько вещей, которые я хочу использовать.Добавление пользовательских RequestCondition в Spring mvc 3.1

Во-первых, это было бы неплохо, если бы я мог бы показать другую домашнюю страницу для различных типов пользователей:

@Controller 
public class HomepageController { 

    @RequestMapping(value = "/") 
    @CustomCondition(roles = Guest.class) 
    public String guestHome() { /*...*/ } 

    @RequestMapping(value = "/") 
    @CustomCondition(roles = Admin.class) 
    public String adminHome() { /*...*/ } 

} 

Во-вторых, я хочу, чтобы приложение, чтобы функционировать как веб-сайт и как сервис REST (например, для мобильных приложений), поэтому я хочу, чтобы веб-сайт получил доступ к действиям html и json и позволил службе (другому субдомену) получить доступ только к действиям json (некий вид @CustomCondition(web = true), который соответствует только URL-адресам сайта)

Может ли это работа для любого из двух применений, которые я планирую?

я нашел очень мало документации о пользовательских условиях, но я нашел, что one exampleimplements custom conditions, которые могли бы быть то, что я хочу, но он использует @Configuration класса вместо конфигурации XML, который я использую, и я не хочу переместите все мои весовые определения xml в класс @Configuration.

Могу ли я определить customMethodCondition для RequestMappingHandlerMapping в XML?

Я попытался подклассов RequestMappingHandlerMapping и переопределить getCustomMethodCondition, чтобы вернуть мой обычай RequestCondition, но это не сработало - getMatchingCondition() в моем состоянии не срабатывает.

Любая помощь была бы принята с благодарностью!

UPDATE

Я читал немного больше, и это выглядит как RequestMappingHandlerMapping новый класс (с вер 3.1).

Что происходит в моем приложении является то, что @Configuration, который пытается переопределить и тем самым переопределить requestMappingHandlerMapping боб на самом деле работает, но отображения URL (@RequestMapping методы в @Controller с), кажется, обрабатываются дважды, один раз в подклассе ExtendedRequestMappingHandlerMapping и один раз оригиналом RequestMappingHandlerMapping - сначала с пользовательским условием, а затем без него.

Нижняя линия - это мои пользовательские условия, которые просто игнорируются.

Это должен быть продвинутая моделью, но ИМО это должно быть довольно распространенным явлением ...

Комментариев кто?

ответ

2

Spring MVC уже предоставляет механизм для различения между JSON и HTML, то RequestMapping аннотацию принимает Потребляет атрибут, который смотрит на тип содержимого запроса ...

// REST version, Content-type is "application/json" 
@RequestMapping(value = "/", consumes = "application/json") 
public void myRestService() { 
... 

// HTML version, Content-type is not "application/json" 
@RequestMapping(value = "/", consumes = "!application/json") 
public void myHtmlService() { 
... 

Другой способ использовать тот же URL но существуют различные методы это с парами или приписывать заголовки ...

// the url is /?role=guest 
@RequestMapping(value = "/", param = "role=guest") 
public void guestService() { 

// the url is/with header role=admin 
@RequestMapping(value = "/", headers = "role=admin") 
public void adminService() { 

Я думаю, что вы хотели бы различные URLs для безопасности. Как правило, с чем-то вроде Spring Security, вы должны поместить все функции администратора под/admin и позволить инфраструктуре управлять всем этим ...

<http auto-config="true"> 
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> 
... 

Этого будет достаточно для вашего использования (-ов)?

+1

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

1

Если у вас есть расширенное RequestMappingHandlerMapping (например, ExtendedRequestMappingHandlerMapping), вам нужно зарегистрировать это новое сопоставление немного по-другому в контексте приложения xml.

Вы не можете использовать <mvc:annotation-driven/> для настройки Spring MVC, как определяет его собственный HandlerMapping внутри, вы можете вместо этого сделать что-то вдоль этих линий (или следовать подходу в связи с @Configuration, что вы предоставили):

<bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService"></property> 
      <property name="validator"> 
       <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 
      </property> 
     </bean> 
    </property> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
     </list> 
    </property> 
</bean> 

<bean name="handlerMapping" class="..ExtendedRequestMappingHandlerMapping"> 
</bean> 

Это должно гарантировать, что ваше сопоставление вступит в силу и обеспечит соответствие handler method компонентом handlerAdapter.

+0

Это имеет смысл. Я попробую. – ori

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