在Spring中将文件作为字符串数组读入

时间:2013-10-08 21:43:36

标签: spring groovy annotations

我有一个名为security.properties的文件,如下所示:

com.example.test.admins=username,username1,username2

我希望将该文件作为字符串数组读入。这实际上适用于一个包:

package com.example.test.security

import org.springframework.beans.factory.annotation.Value
import org.springframework.ldap.core.DirContextOperations
import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator

class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator {
    @Value('${com.example.test.admins}')
    private String[] admins

    @Override
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(
            DirContextOperations userData, String username) {
        def roles = [new SimpleGrantedAuthority("user")]
        if (username in admins)
            roles.add(new SimpleGrantedAuthority("admin"))
        roles
    }
}

我已经检查了每个导入,每个导入都是由导入文件以外的东西使用的。

在另一个包中,它会忽略字符串插值:

package com.example.test.controller

// imports excluded for brevity

@Controller
class UserController {
    @Value('${com.example.test.admins}')
    private String[] admins

    public User get() {
        def name = // Name gets put here
        def admin = name in admins
        println admins
        println admin
        return new User(name: name, admin: admin)
    }
}

在控制台中产生此输出:

[${com.example.test.admins}]
false

唯一提到的文件是security-applicationContext.xml

<context:property-placeholder
     location="classpath:security.properties"
     ignore-resource-not-found="true"
     ignore-unresolvable="true"/>

但是,将其复制到applicationContext.xml并不会改变任何内容。

1 个答案:

答案 0 :(得分:1)

感谢@ataylor指出我正确的方向。

Spring中的控制器不使用相同的上下文。所以我创建了一个名为UserService的服务:

@Service
class UserService {
    @Value('${com.example.test.admins}')
    private String[] admins

    boolean getUserIsAdmin(String username) {
        username in admins
    }

}

在服务中自动装配的UserController中,它就像魅力一样。