Java DAOImpl中的Spring MVC读取属性文件为空

Java DAOImpl中的Spring MVC读取属性文件为空,java,spring,spring-mvc,properties,spring-security,Java,Spring,Spring Mvc,Properties,Spring Security,我需要读取UserDetailsDaoImpl中的属性值。我正在使用Spring安全性 <beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" > <beans:property name="dataSource" ref="dataSource" /> </beans:bean> <beans:bean id="encoder" cla

我需要读取UserDetailsDaoImpl中的属性值。我正在使用Spring安全性

<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>
它成功地读取
@控制器的内部
,但不在此类中,可能是因为它是
@存储库

<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>
如何读取属性值

<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>
UserDetailsDaoImpl:

@Repository
public class UserDetailsDaoImpl extends JdbcDaoSupport implements UserDetailsDao {

    @Value("${emails_blocked}")
    private String emails_blocked;
@Autowired
UserDetailsDao userDetailsDao;

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {

    try {

        Authentication auth = super.authenticate(authentication);

        // if reach here, means login success, else exception will be thrown
        // reset the user_attempts
        userDetailsDao.resetFailAttempts(authentication.getName());

        return auth;

    } catch (BadCredentialsException e) {

        userDetailsDao.updateFailAttempts(authentication.getName());
        throw e;

    }
<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>
static String emails_blocked;

public static void setEmails_Blocked(String emails_blocked){
    UserDetailsDaoImpl.emails_blocked= emails_blocked;
}
豆子:

<context:property-placeholder location="classpath:config.properties"/>
<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>
我的豆豆更新:

<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>

<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>

我的问题是,因为我调用了一个方法,它不会加载@Value,所以我必须注入一些bean。 像这样:

<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>
<bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config.properties</value>            
            </list>
        </property>
    </bean>

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="staticMethod" value="com.setelog.spring.dao.UserDetailsDaoImpl.setEmails_Blocked"/>
        <property name="arguments">
            <list>
                <value>${emails_blocked}</value>
            </list>
       </property>
    </bean>
这个答案对我帮助很大:

确保您自己没有创建新实例,并且在
@存储库
所在的上下文中也有一个
。如果没有任何东西将被替换。@M.Deinum您能给我举个例子吗?我不明白。谢谢你怎么不明白?检查您使用此控制器的位置您自己没有创建新实例,并确保您在定义/加载存储库的应用程序上下文中配置了占位符。我已更新了我的问题,说明了如何调用它。我还添加了一个autowire并检查了占位符,但仍然是相同的配置文件中没有
,因此您的
@Value
基本上是无用的。添加它。不,您不需要。您只需要在正确的上下文中指定
。它将只在相同上下文中的bean上运行,在您的情况下,仅由
DispatcherServlet
加载的bean将该行添加到
ContextLoaderListener
<beans:bean id="userDetailsDao" class="com.setelog.spring.dao.UserDetailsDaoImpl" >
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>


<beans:bean id="authenticationProvider"
    class="com.setelog.spring.handler.LimitLoginAuthenticationProvider">
    <beans:property name="userDetailsService" ref="customUserDetailsService" />
    <beans:property name="userDetailsDao" ref="userDetailsDao" />
    <beans:property name="passwordEncoder" ref="encoder" />

</beans:bean>