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

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

...我见过的所有示例都像这样,因此都在使用默认的无参数构造函数
<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> 中使用引用而不是 bean 的任何方法.但是,根据您想要做什么,有几种解决方法。
  • 使用 Bean Factory
  • 创建一个实现 HandlerMethodArgumentResolver 的代理类并将每个调用转发到另一个实例,然后您就可以拥有自己的 SecurityRequestParametersArgumentResolver像一个普通的 bean 并在 <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>  
    

    关于spring - 在 Spring 3-1 中,我如何将 bean 引用指定为参数解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13868784/

    相关文章:

    java - 使用相同的请求映射重载 spring Controller 方法

    java - spring boot中如何访问非主DataSource?

    java - Spring Integration - 入站文件端点。如何正确处理文件。

    spring - Spring Boot Mongo带有非结构化文档

    java - ${pageContext.request.contextPath} 在本地工作,但不能远程工作

    java - 集成 Spring 2.5 和遗留 Servlet 应用程序

    java - 这个架构定义可以吗?多层(Spring/多数据库)

    spring - Spring中 "addError(ObjectError error)"和 "rejectValue(String field, String errorCode)"之间的区别

    java - 无法创建 bean——需要 Autowire 候选项

    java - 我的 Spring SecurityConfig 没有被获取