java - 如何使用已在另一个 .xml 文件中配置的 bean?

标签 java xml spring spring-security

我正在尝试关注this example关于 Spring Security 并使其适应我的需求,但我在配置方面遇到了麻烦

我有一个 LoginService ,如下所示:

// This example does not make sense of course but I'm just
// trying to make it work with @PreAuthorize("hasRole('ROLE_ADMIN')")
// and see an exception or something that lets me know that
// it is actually working ..

public class LoginService {

    private final static Logger LOGGER = Logger.getLogger(LoginService.class.getName());

    private AdministratorRepository administratorRepository;

    public LoginService(DSLContext ctx) {       
        this.administratorRepository = new AdministratorRepository(ctx);
    }

    @Transactional
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public void login(String userId, String password) {     
        LOGGER.debug("Login for " + userId);        
        this.administratorRepository.login(userId, password);   
    }

}

并且我已经在我的 applicationContext-jooq.xml 中初始化此类:

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5432/mz_db" />
    <property name="username" value="postgres" />
    <property name="password" value="1234" />
</bean>

<!-- Configure Spring's transaction manager to use a DataSource -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- Configure jOOQ's TransactionProvider as a proxy to Spring's transaction manager -->
<bean id="transactionProvider"
    class="com.mz.server.web.SpringTransactionProvider">
</bean>

<!-- Configure jOOQ's ConnectionProvider to use Spring's TransactionAwareDataSourceProxy,
     which can dynamically discover the transaction context -->
<bean id="transactionAwareDataSource"
    class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg ref="dataSource" />
</bean>

<bean class="org.jooq.impl.DataSourceConnectionProvider" name="connectionProvider">
    <constructor-arg ref="transactionAwareDataSource" />
</bean>

<!-- Configure the DSL object, optionally overriding jOOQ Exceptions with Spring Exceptions -->
<bean id="dsl" class="org.jooq.impl.DefaultDSLContext">
    <constructor-arg ref="config" />
</bean>

<!-- Invoking an internal, package-private constructor for the example
     Implement your own Configuration for more reliable behaviour -->
<bean class="org.jooq.impl.DefaultConfiguration" name="config">
    <property name="SQLDialect"><value type="org.jooq.SQLDialect">POSTGRES_9_4</value></property>
    <property name="connectionProvider" ref="connectionProvider" />
    <property name="transactionProvider" ref="transactionProvider" />
</bean>

<!-- BEGIN Services -->

<bean id="loginService" class="com.mz.server.web.service.LoginService">
    <constructor-arg>
        <ref bean="dsl" />
    </constructor-arg>
</bean>

<!-- END Services -->

我的问题是我希望 loginService 也由 Spring Security 管理。这是我的 applicationContext-security.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <global-method-security pre-post-annotations="enabled" secured-annotations="enabled" />

    <http auto-config="true" >
        <intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />
    </http>

    <authentication-manager >
        <authentication-provider>
            <user-service>
                <user name="admin" password="admin" authorities="ROLE_ADMIN" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

<!-- <beans:bean name="loginService" class="com.mz.server.web.service.LoginService"/> -->

</beans:beans>

如果我注释掉

<beans:bean name="loginService" class="com.mz.server.web.service.LoginService"/>

我收到没有默认构造函数的错误 - 这是正确的,因为此类是 1. 已实例化且 2. 需要 DSLContext 对象作为构造函数参数。

如果我将其注释掉,则什么也不会发生。没有显示警告异常。 @PreAuthorize 似乎被忽略了..

如何解决这个问题?

最佳答案

您可以将构造函数注入(inject)添加到 LoginService 的 XML 配置中。你也 Autowiring DSLContext吗?

XML 中的这一行正在调用默认构造函数:

<beans:bean name="loginService" class="com.mz.server.web.service.LoginService"/>

如果你想对DSLContext进行构造函数注入(inject),它看起来像这样:

<bean name="loginService" class="com.mz.server.web.service.LoginService">
    <constructor-arg ref="dslContext"/>
</bean>

这假设 bean 工厂也有一个用于您的 DSLContext 的 bean。

您还可以尝试使用所有注释或 XML 配置,但不要混合和匹配。

关于java - 如何使用已在另一个 .xml 文件中配置的 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33001745/

相关文章:

Java三元运算符混淆

java - 用Java中的值替换变量

Java 在对象或变量上同步?

Android、启动器和最喜欢的应用程序

c# - 与单行匹配时,正则表达式不匹配多个结果

java - 使用spring工具套件中的jpa工具生成涉及外键和复合主键的实体后​​运行服务器时出现异常

java - 为什么 Glassfish 拒绝我在 Netbeans 7.3.1 下的所有身份验证工作?

java - 有没有一种快速的方法可以将 Java xml 对象转换为 Scala xml 对象?

java - Spring Integration 中的 Http Outbound Gateway 错误处理

java - spring security Remember Me logut 不清除 cookie