Spring @Value字段为null

时间:2015-02-13 16:27:07

标签: java spring hibernate spring-mvc

我在Spring中遇到@Value注释问题,我在属性文件中尝试设置字段。我的配置applicationContext.xml是

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

属性文件位于src / main / resources / config / local / general.properties

常规属性

general.key="EDC183ADVARTT"

在我班上我想从这个文件中注入字段。 我的班级

import java.security.Key;

import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec;
import javax.persistence.AttributeConverter;

import org.postgresql.util.Base64; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.stereotype.Component;

@javax.persistence.Converter 
@Component 
public class EntityEncryptionConverter implements AttributeConverter<String, String> {

    @Value("${general.key}")
    private String keyCode;

    private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
    private static final byte[] KEY = "395DEADE4D23DD92".getBytes();

    public String convertToDatabaseColumn(String ccNumber) {
        System.out.print(keyCode);
        // do some encryption
        Key key = new SecretKeySpec(KEY, "AES");
        try {
            Cipher c = Cipher.getInstance(ALGORITHM);
            c.init(Cipher.ENCRYPT_MODE, key);
            return Base64.encodeBytes(c.doFinal(ccNumber.getBytes()));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public String convertToEntityAttribute(String dbData) {
        // do some decryption
        Key key = new SecretKeySpec(KEY, "AES");
        try {
            Cipher c = Cipher.getInstance(ALGORITHM);
            c.init(Cipher.DECRYPT_MODE, key);
            return new String(c.doFinal(Base64.decode(dbData)));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

为什么我的KeyCode值为null?

4 个答案:

答案 0 :(得分:1)

此:

<value>classpath:config/local/*.properties</value>

应该是:

 <value>classpath:*.properties</value>

答案 1 :(得分:0)

值上有一个拼写错误的额外'

@Value("{general.key'}")

应该是:

@Value("{general.key}")

答案 2 :(得分:0)

请尝试以下操作:

@Value("#{general['general.key']}")

答案 3 :(得分:0)

EntityEncryptionConverter bean与PropertyPlaceholderConfigurer位于相同的Spring上下文中吗?后处理器仅在相同的上下文中装饰bean。

修改

正如我们所讨论的,您在JPA中获得的EntityEncryptionConverter实例不是Spring的组件扫描创建的Spring托管实例。因此,没有在keyCode上设置值。

我认为你在这里有一些选择,我发现其中没有一个非常“干净”。

  1. 不要使用Spring在Converter中获取keyCode值。在Converter中,通过Java Properties从属性文件old school中读取keyCode值。

  2. 你想使用Spring,好吧......然后创建一个Application Context aware转换器。您可以按照here所述创建AppContext提供程序。使用该提供程序,您可以在Spring中查找keyCode(可能必须将其作为String bean公开),或者您可以查找Spring正在管理的EntityEncryptionConverter实例,然后将转换器方法委派给该实例。

    < / LI>