2015-02-13 2 views
0

У меня проблема с аннотацией @Value весной, я пытаюсь установить поле из файла свойств. Моя конфигурация applicationContext.xml являетсяПоле весны @Value null

<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/основные/ресурсы/конфигурации/местные/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 равно нулю?

+1

@Value ("{general.key '}") private String keyCode; - почему у вас есть «после ключа»? – ashosborne1

+0

Собор, я много пробовал, и я забыл удалить это. теперь его нормально :) – Murder

ответ

0

ли боб EntityEncryptionConverter в том же контексте Spring как PropertyPlaceholderConfigurer? Почтовые процессоры только украшают бобы в том же контексте.

Редактировать

Как мы уже говорили, экземпляр EntityEncryptionConverter вы получаете в JPA не Spring управляемый экземпляр, созданный компонент сканирования в Spring. Таким образом, значение keyCode не задано.

Я думаю, у вас есть несколько вариантов выбора, ни один из которых я считаю очень «чистым».

  1. Не используйте Spring для получения значения KeyCode в конвертере. В конвертере прочитайте значение keyCode из старой школы свойств через Java Properties.

  2. Вы хотите использовать Spring, ok ... Затем создайте конвертер, ориентированный на контекстно-медийную сеть. Вы можете создать провайдера AppContext, как описано here. С этим провайдером вы можете либо посмотреть ключевой код весной (возможно, придется выставлять его как String bean), либо вы можете посмотреть экземпляр EntityEncryptionConverter, который Spring управляет, а затем делегировать методы конвертера этому экземпляру.

+0

Что ты имеешь в виду? что-то вроде Murder

+0

Является ли компонент-сканирование для пакета, содержащего EntityEncryptionConverter, в вашем приложенииContext.xml? Или это, скажем, контекст сервлетов отправки? – MarkOfHall

+0

Или попросил другой способ, как настроить сканирование вашего компонента на загрузку EntityEncryptionConverter? – MarkOfHall

0

Был опечатка в значении с дополнительным '

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

Должно быть:

@Value("{general.key}") 
+0

ваше решение все еще не работает – Murder

1

Это:

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

должно быть:

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

У меня есть больше свойств в config/local, я не могу изменить это, у меня есть db.properties, mail.properties и это нормально работает. – Murder

+0

@Murder Является ли укрывателем автолюбительство в других классах? – Jens

+0

им с помощью этого класса для шифрования и дешифрования, как "@NotAudited \t @CreditCardNumber \t @Convert (конвертер = EntityEncryptionConverter.class) \t частная строка cardNumber;" – Murder

0

Попробуйте следующее:

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

Я получил эту ошибку Свойство или поле 'general' не может быть найдено на объекте типа 'org.springframework.beans.factory.config.BeanExpressionContext' - возможно, не публично? – Murder

+0

Нет, он должен вводить в частную собственность. Попробуйте удалить двойные кавычки в файле свойств. 'general.key = EDC183ADVARTT' не нужно. –

+0

Я удалил и все еще такая же ситуация :) – Murder