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


这是一个

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

。我看到的所有示例都看起来像这样,因此都在遵循默认的无参数构造函数

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

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

谢谢!

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

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

但是我不知道有什么方法可以在<mvc:argument-resolvers>中使用引用而不是豆子。但是根据你想做什么,有几个工作轮。

  • 使用豆工厂
  • 创建一个实现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        
}

配置:

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

最新更新