2012-12-13 11 views
6

Questa è una domanda di sintassi relativa a una configurazione Spring (fare riferimento a spring-beans-3.1.xsd e spring-mvc-3.1.xsd).Come specificare un riferimento bean come risolutore di argomenti, in primavera 3-1?

Ho una definizione di bean specifica (id = "SecurityRequestParametersArgumentResolver") che voglio registrare come risolutore di argomenti personalizzati. Il frammento XML è:

<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> 

... Tutti gli esempi che ho visto simile a questa, e quindi stanno andando dopo il default non-argomento del costruttore

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

ripetere la domanda, che cosa dovrebbe la sintassi Spring deve essere usata per usare un riferimento bean come un resolver di argomenti personalizzato?

Grazie!

risposta

1

Almeno il problema argomento del costruttore può essere risolto facilmente

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

Ma non so alcun modo per utilizzare un riferimento al posto di un bean all'interno <mvc:argument-resolvers>. Ma a seconda di cosa vuoi fare, ci sono diversi workarrounds.

  • Utilizzare un Bean Factory
  • Creare una classe proxy che implementa il HandlerMethodArgumentResolver e in avanti ogni chiamata a un altro caso, allora si può avere il proprio SecurityRequestParametersArgumentResolver come un fagiolo normale e registrare il proxy nella sezione <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> 
Problemi correlati