Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用已在另一个.xml文件中配置的bean?_Java_Xml_Spring_Spring Security - Fatal编程技术网

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

Java 如何使用已在另一个.xml文件中配置的bean?,java,xml,spring,spring-security,Java,Xml,Spring,Spring Security,我正试图关注SpringSecurity并使其适应我的需要,但它的配置有问题 我有一个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 th

我正试图关注SpringSecurity并使其适应我的需要,但它的配置有问题

我有一个
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);   
    }

}
<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 -->
<bean name="loginService" class="com.mz.server.web.service.LoginService">
    <constructor-arg ref="dslContext"/>
</bean>
我已经在我的应用程序上下文jooq.xml中初始化了这个类,如下所示:

// 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);   
    }

}
<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 -->
<bean name="loginService" class="com.mz.server.web.service.LoginService">
    <constructor-arg ref="dslContext"/>
</bean>
如果我不加评论

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

我得到的错误是没有默认构造函数-这是真的,因为这个类是1。已经实例化并且2。需要一个
DSLContext
对象作为构造函数参数

如果我让它评论出来,什么也不会发生。未显示任何警告例外
@PreAuthorize
似乎被忽略


我如何解决这个问题

您可以将构造函数注入添加到
LoginService
的XML配置中。您是否也自动连线
DSLContext

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

<beans:bean name="loginService" class="com.mz.server.web.service.LoginService"/>
这假设bean工厂也有一个bean用于
DSLContext


您还可以尝试进行所有注释或XML配置,但不能混合和匹配。

您可以将构造函数注入添加到
登录服务的XML配置中。您是否也自动连线
DSLContext

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

<beans:bean name="loginService" class="com.mz.server.web.service.LoginService"/>
这假设bean工厂也有一个bean用于
DSLContext



您也可以尝试进行所有注释或XML配置,但不能混合和匹配。

在applicationContext-jooq.XML中,
DSLContext
作为构造函数参数传递(见上文)-你的意思是构造函数注入吗?请看我的更新答案:当你正确地执行构造函数注入时,它正好是构造函数注入的样子。我不明白。这就是我在applicationContext jooq.xml中所做的?看,bean工厂说你搞错了。检查你的假设。如果你认为一切都是对的,而春天正在迫害你,那么你就没有进步。这里有一个configure,您可以在其中请求一个默认值,但没有。修好它,好的。但我的问题不是我不知道如何将
DSLContext
传递给
LoginService
。我的问题是,我不知道如何重用bean
,该bean已经在我的applicationContext-security.xml中的applicationContext-jooq.xml中描述过。您的建议是,我只需将配置从-jooq.xml复制并粘贴到-security.xml,然后按照我已经使用的方式使用
dsl
。我的问题旨在避免在两个不同的配置文件中对bean进行完全相同的配置。
DSLContext
作为构造函数参数在applicationContext-jooq.xml中传递(见上文)-你的意思是构造函数注入吗?请看我的更新答案:当你正确地执行构造函数注入时,它正好是构造函数注入的样子。我不明白。这就是我在applicationContext jooq.xml中所做的?看,bean工厂说你搞错了。检查你的假设。如果你认为一切都是对的,而春天正在迫害你,那么你就没有进步。这里有一个configure,您可以在其中请求一个默认值,但没有。修好它,好的。但我的问题不是我不知道如何将
DSLContext
传递给
LoginService
。我的问题是,我不知道如何重用bean
,该bean已经在我的applicationContext-security.xml中的applicationContext-jooq.xml中描述过。您的建议是,我只需将配置从-jooq.xml复制并粘贴到-security.xml,然后按照我已经使用的方式使用
dsl
。我的问题旨在避免在两个不同的配置文件中对bean进行完全相同的配置。
applicationContext安全性
applicationContext jooq
是否加载在相同的上下文中?@M.Deinum老实说,我无法回答这个问题。我怎么知道他们是不是?基本上,applicationContext-security.xml应该只包含与Spring相关的bean,而applicationContext-jooq只描述了数据库连接的工作方式。我如何判断它们是否加载在相同的上下文中?如果它们都加载了
COntextLoaderListener
,则如果其中一个由
DispatcherServlet加载,则将正常工作。另一件事是您没有接口,因此您可能需要在
全局方法安全性
元素上将
代理目标类设置为
true
。我还建议您阅读Spring的工作原理,尤其是
应用上下文的配置如何工作。
应用上下文安全性
applicationContext jooq
加载在同一上下文中?@M.Deinum老实说,我不能回答这个问题。我怎么知道他们是不是?基本上,applicationContext-security.xml应该只包含与Spring相关的bean,而applicationContext-jooq只描述了数据库连接的工作方式。我如何判断它们是否加载在相同的上下文中?如果它们都加载了
COntextLoaderListener
,则如果其中一个由
DispatcherServlet加载,则将正常工作。另一件事是您没有接口,因此您可能需要在
全局方法安全性
元素上将
代理目标类设置为
true
。我还建议您阅读Spring的工作原理,特别是
应用程序上下文的配置如何工作。