2012-12-13 23 views
6

Đây là câu hỏi cú pháp về cấu hình Spring (tham khảo spring-beans-3.1.xsd và spring-mvc-3.1.xsd).Làm cách nào để chỉ định tham chiếu bean làm đối số-giải quyết, trong Spring 3-1?

Tôi có định nghĩa bean cụ thể (id = "SecurityRequestParametersArgumentResolver") mà tôi muốn đăng ký làm trình giải quyết đối số tùy chỉnh. Đoạn xml là:

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

... Tất cả những ví dụ tôi đã thấy giống như thế này, và do đó sẽ sau khi mặc định không tham số constructor

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

Lặp đi lặp lại câu hỏi, những gì nên cú pháp Spring là để sử dụng một tham chiếu bean như một trình giải quyết đối số tùy chỉnh?

Cảm ơn!

Trả lời

1

Ít nhất là vấn đề tranh cãi constructor có thể được giải quyết một cách dễ dàng

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

Nhưng tôi không biết cách nào để sử dụng một tham chiếu thay vì một bean trong <mvc:argument-resolvers>. Nhưng tùy thuộc vào những gì bạn muốn làm, có một số workarrounds.

  • Sử dụng một máy Bean
  • Tạo một lớp proxy đó thực hiện các HandlerMethodArgumentResolver và chuyển tiếp tất cả các cuộc gọi đến một ví dụ khác, sau đó bạn có thể có riêng SecurityRequestParametersArgumentResolver của bạn giống như một hạt đậu bình thường và đăng ký Proxy trong phần <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> 
Các vấn đề liên quan