2012-12-13 13 views
6

To jest pytanie składniowe dotyczące konfiguracji Spring (zobacz spring-beans-3.1.xsd i spring-mvc-3.1.xsd).Jak określić odwołanie do komponentu bean jako argument-resolvera, na wiosnę 3-1?

Mam określoną definicję komponentu bean (id = "SecurityRequestParametersArgumentResolver"), którą chcę zarejestrować jako niestandardowy przelicznik argumentów. Xml fragment brzmi:

<bean id="SecurityRequestParametersArgumentResolver" 
    class="xxx.security.web.SecurityRequestParametersArgumentResolver"> 
    <property name="credentialsManager" ref="CredentialsManager" /> 
    <property name="tokenService" ref="TokenService" /> 
</bean> 

... AND I would like to use a bean reference. The following three lines don't obey the xsd-grammar (what should be the correct tag declaration here?) 
<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <bean ref="SecurityRequestParametersArgumentResolver"/> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

... Wszystkie przykłady widziałem wyglądać tak, a zatem idą po domyślnie bez argumentów konstruktora

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <bean class="class="xxx.security.web.SecurityRequestParametersArgumentResolver"/> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

Powtarzając pytanie, co powinno składnia Spring ma na celu użycie odwołania do komponentu bean jako niestandardowego przelicznika argumentów?

Dzięki!

Odpowiedz

1

Przynajmniej problem argumentem konstruktora może być rozwiązany łatwo

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <bean class="class="xxx.security.web.SecurityRequestParametersArgumentResolver"> 
      <constructor-arg value="123"/> 
     </bean> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

Ale ja nie znam żadnego sposobu korzystania odniesienie zamiast fasoli ciągu <mvc:argument-resolvers>. Ale w zależności od tego, co chcesz zrobić, istnieje kilka sposobów obejścia problemu.

  • Użyj Bean Fabrykę
  • Utwórz klasę proxy, który implementuje HandlerMethodArgumentResolver i przekazuje każdą rozmowę na inny przykład, można mieć swój własny SecurityRequestParametersArgumentResolver jak normalny fasoli i zarejestrować Proxy w sekcji <mvc:argument-resolvers>.

Proxy:

class HandlerMethodArgumentResolverProxy 
     implements HandlerMethodArgumentResolver{ 
    HandlerMethodArgumentResolver delegate; 

    publicHandlerMethodArgumentResolverProxy 
        (HandlerMethodArgumentResolver delegate){ 
     this.delegate=delegate; 
    } 

    public boolean supportsParameter(MethodParameter parameter) { 
     this.delegate.supportsParameter(parameter); 
    } 

    //delegate for resolveArgument   
} 

config:

<bean id="securityRequestParametersArgumentResolver" 
    class="xxx.security.web.SecurityRequestParametersArgumentResolver"> 
    ... 
</bean> 

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <bean class "HandlerMethodArgumentResolverProxy"> 
      <constructor-arg 
       ref="securityRequestParametersArgumentResolver"/> 
     </bean> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 
Powiązane problemy