在Spring 3-1中,如何将bean引用指定为参数解析器?

Mar*_*ark 6 spring spring-mvc

这是关于Spring配置的语法问题(请参阅spring-beans-3.1.xsd和spring-mvc-3.1.xsd).

我有一个特定的bean定义(id ="SecurityRequestParametersArgumentResolver"),我想注册为自定义参数解析器.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>
Run Code Online (Sandbox Code Playgroud)

...我看到的所有示例都看起来像这样,因此是在默认的无参数构造函数之后

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="class="xxx.security.web.SecurityRequestParametersArgumentResolver"/>
    </mvc:argument-resolvers>
</mvc:annotation-driven>
Run Code Online (Sandbox Code Playgroud)

重复这个问题,为了将bean引用用作自定义参数解析器,Spring语法应该是什么?

谢谢!

Ral*_*lph 1

至少构造函数参数问题可以轻松解决

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="class="xxx.security.web.SecurityRequestParametersArgumentResolver">
           <constructor-arg value="123"/>
        </bean>
    </mvc:argument-resolvers>
</mvc:annotation-driven>
Run Code Online (Sandbox Code Playgroud)

但我不知道有什么方法可以在<mvc:argument-resolvers>. 但根据您想要做什么,有几种解决方法。

  • 使用 Bean 工厂
  • 创建一个代理类来实现HandlerMethodArgumentResolver并将每个调用转发到其他实例,然后您可以像普通 bean 一样拥有自己的代理类SecurityRequestParametersArgumentResolver并在该部分中注册代理<mvc:argument-resolvers>

代理人:

class HandlerMethodArgumentResolverProxy
       implements HandlerMethodArgumentResolver{
    HandlerMethodArgumentResolver delegate;

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

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

    //delegate for resolveArgument        
}
Run Code Online (Sandbox Code Playgroud)

配置:

<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>  
Run Code Online (Sandbox Code Playgroud)