我有以下情况:
appContext.xml:包含DAO mappers bean(UserMapper,RoleMapper ...)
appContext-security.xml:包含需要引用我的某个服务的http标签(UserDetailsService)
app-servlet.xml:包含用于查找注释的标签
<context:component-scan base-package="com.example.myapp"/>
<mvc:annotation-driven/>
我的服务有@Service(&#34; serviceName&#34;)注释。这意味着bean是由app-servlet.xml创建的。
OpenID登录需要UserDetailsService类工作,UserDetailsService有一个自动装配字段(UserService)这是我的appContext-security.xml:
<security:http auto-config="true">
<security:intercept-url pattern="/welcome*" access="ROLE_USER, ROLE_ADMIN" />
<security:intercept-url pattern="/user/*" access="ROLE_USER, ROLE_ADMIN" />
<security:intercept-url pattern="/rest/*" access="ROLE_USER, ROLE_ADMIN" />
<security:intercept-url pattern="/admin/*" access="ROLE_ADMIN" />
<security:logout logout-success-url="/" />
<security:openid-login default-target-url="/welcome" authentication-failure-url="/loginfailed" user-service-ref="userDetailsService"/>
<security:form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/loginfailed" />
<security:access-denied-handler ref="openIdAuthFailureHandler"/>
</security:http>
我想我不能引用UserDetailsService,因为它是由app-servlet.xml创建的,它是根配置文件的子代(appContext.xml和appContext-security.xml)
如果我尝试在appContext-security.xml中声明UserDetailsService,则其自动装配字段UserService在调试中为空:
<bean id="userDetailsService" class="com.example.myapp.service.impl.UserDetailsServiceImpl"/>
这可能是拆分扫描的解决方案吗?也许,在appContext.xml中扫描服务并仅在app-servlet中扫描控制器可能是一个好主意,但我不知道它是否有意义。
我想让@Service注释UserDetailsService并获取对appContext-security.xml的引用。这是我的主要问题。我可以参考appContext-security.xml中使用@Service创建的UserDetailservice吗?如果不是......我需要做哪些改变?
正确答案将被投票。
编辑:
我做了以下事情:
appContext.xml:
<context:component-scan base-package="com.example.myapp">
<context:exclude-filter type="regex" expression="com\.example\.myapp\.controller..*"/>
</context:component-scan>
APP-servlet.xml中:
<context:component-scan base-package="com.example.myapp.controller" />
<!-- Enabling Spring MVC configuration through annotations -->
<mvc:annotation-driven />
现在可行了
答案 0 :(得分:0)
您需要做的就是更改组件扫描。
在appContext.xml
(根应用程序上下文的配置)
<context:component-scan base-package="com.example.myapp">
<context:exclude-filter type="regex" expression="com\.example\.myapp\.controller..*"/>
<!--or use this instead
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
-->
</context:component-scan>
在app-servlet.xml
(Web应用程序上下文的配置)
<context:component-scan base-package="com.example.myapp.controller" />
这样,除了控制器之外的所有bean都将出现在根应用程序上下文中,因此可以在您的安全代码中访问。