Как вставить значения свойств в компонент Spring Boot

В моем приложении Spring Boot Application я реализовал следующий класс с методом вызова хранимой процедуры.

@Component
@ConfigurationProperties(prefix = "spring")
public class FmTrfUtil {
    static int returnVal;
    @Value("${spring.datasource.url}")
    static String url;

    public static int insertFmTrfs(List<String> trfs, String source) {
        System.out.println(url);
        EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();
        Session session = em.unwrap( Session.class );
        final String[] trfArray = trfs.toArray(new String[trfs.size()]);
        final String src = source;

        session.doWork( new Work(){
            public void execute(Connection conn) throws SQLException {
                CallableStatement stmt = null;               
                OracleConnection oraCon = conn.unwrap(OracleConnection.class);
                Array array = oraCon.createARRAY("VARCHAR2_TAB_T", trfArray);
                stmt = conn.prepareCall("{? = call FM_TRF_UTIL.process_fm_trf(?,?)}");
                stmt.registerOutParameter(1, Types.INTEGER);
                stmt.setArray(2, array);
                stmt.setString(3, src);
                stmt.execute();
                returnVal = stmt.getInt(1);
            }
        });
        return returnVal;
    }
}

Поскольку для вызова хранимой процедуры требуется подключение к базе данных, мне нужно загрузить соответствующие значения свойств из application.properties:

spring.profiles.active=dev
spring.datasource.url=jdbc:oracle:thin:@ldap://xxx:389/risdev3, cn=OracleContext,dc=x,dc=net
spring.datasource.username=owner
spring.datasource.password=owner987

На основании следующих статей о подобной проблеме Spring boot - пользовательские переменные в Application.properties и Использование свойств конфигурации Spring-Boot в ваших собственных классах и Пример Spring Boot @ConfigurationProperties, я добавил эту аннотацию для своего класса @ConfigurationProperties(prefix = "spring") (все свойства для подключения к базе данных имеют префикс "spring"). Однако, когда я запустил его с тестовым классом, как показано ниже, я получил ошибку «приложение должно предоставлять соединение JDBC», что означает, что свойства в application.properties не используются.

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = RistoreWebApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
public class FmTrfUtilTest {
    @Test
    public void test() {
        List<String> trfs = new ArrayList<String>();
        trfs.add("TRF000001");
        trfs.add("TRF000002");
        int ret = FmTrfUtil.insertFmTrfs(trfs, "SARC");
        assertTrue(ret > 0);
    }
}

Чтобы @ConfigurationProperties работала, я также добавил зависимость от maven spring-boot-configuration-processor. Почему до сих пор не работает? Что я пропустил?


person ddd    schedule 04.11.2016    source источник


Ответы (1)


Здесь есть несколько ошибок:

  • @Value не работает со статическими полями
  • @ConfigurationProperties используются для привязки полей из application.properties или application.yml к объекту Java. Посмотрите на любой @ConfigurationProperties аннотированный класс из самого Spring Boot, чтобы легко понять, как его следует использовать.
  • вы не должны использовать свой собственный @ConfigurationProperties с префиксом spring, поскольку он уже используется самой Spring Boot
  • spring-boot-configuration-processor используется только для лучшего завершения кода в вашей среде IDE. Вам это не нужно.

Если вы хотите использовать свойства конфигурации Spring Boot для подключения к базе данных, вместо создания EntityManager, как вы:

EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();

Вы должны просто ввести его, предполагая, что у вас есть Spring Data JPA Starter в вашем списке зависимостей.

Я вижу, вы используете множество static методов и полей. Это не сработает со Spring. Вместо этого используйте внедрение зависимостей и автоматически подключайте то, что вам нужно.

person Maciej Walkowiak    schedule 04.11.2016
comment
Как именно мне их вводить? Я попытался ввести EntityManager с @PersistenceContext(unitName = "RIStore_FM") static EntityManager em; чуть выше метода, но получил Persistence annotations are not supported on static fields ошибку. Если я извлечу static, он не будет компилироваться, говоря, что em в методе должны быть объявлены статическими - person ddd; 05.11.2016
comment
Ни метод, ни поле не должны быть статическими. Посмотрите примеры проектов Spring Data и справочные материалы. Использовать JPA с Spring действительно просто, если вы делаете это способом Spring. - person Maciej Walkowiak; 05.11.2016