2016-11-04 9 views
0

私のSpringブートアプリケーションでは、ストアドプロシージャを呼び出すメソッドで次のクラスを実装しました。ストアドプロシージャを呼び出すと、データベース接続を必要とするのでSpringブートコンポーネントにプロパティ値を挿入する方法

@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 boot - custom variables in Application.propertiesUsing Spring-Boot configuration properties in your own classesSpring Boot @ConfigurationProperties exampleに関する以下の記事に基づいて

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 

私のクラス@ConfigurationProperties(prefix = "spring")のためにこのアノテーションを追加しました(データベース接続のプロパティはすべて接頭辞として "spring"を持っています)。しかし、次のようにテストクラスを実行すると、「アプリケーションがJDBC接続を提供する必要があります」というエラーが表示されます。つまり、application.propertiesのプロパティは取得されません。 @ConfigurationPropertiesが動作するためには

@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); 
    } 
} 

、私はあまりにもMavenの依存関係spring-boot-configuration-processorを追加しました。なぜまだ動作していないのですか?私は何を取りこぼしたか?

答えて

1

は間違ってここにいくつかのことがあります。

  • @Value

    application.propertiesまたはJavaオブジェクトへのapplication.ymlからのフィールドを結合するために使用される静的フィールド
  • @ConfigurationProperties上では動作しません。どのように使用するべきかを簡単に理解するために、Springブート自体の@ConfigurationProperties注釈付きクラスを見てください。
  • それはすでに春ブーツ自体
  • spring-boot-configuration-processorは、あなただけのIDEでのよりよいコード補完のために使用されているが使用していますので、あなたは接頭辞spring@ConfigurationProperties独自のものを使用しないでください。あなたはこれを必要としません。

あなたの代わりにあなたのようなEntityManagerをか作成するので、データベース接続のための春のブート構成プロパティを利用したい場合:

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

をあなたはちょうどあなたがあなたの中に春データJPAスターターを持っていると仮定し、それを注入しなければなりません依存関係リスト。

多くのstaticメソッドとフィールドが使用されています。それは春にはうまくいかないでしょう。代わりに依存関係注入を使用して、必要なものを自動生成します。

+0

emを正確に注入する必要がありますか?メソッドのすぐ上に '@PersistenceContext(unitName =" RIStore_FM ")' '静的EntityManager em;を持つ' EntityManager'を注入しようとしましたが、 'Persistenceアノテーションは静的フィールドでサポートされていません'というエラーがあります。私が 'static'を取り除くと、メソッドの静的宣言が必要であるとコンパイルされません。 – ddd

+0

メソッドもフィールドも静的ではありません。 Spring Dataサンプルプロジェクトとリファレンスを見てください。 SpringでJPAを使用するのは、Springのやり方をすれば本当に簡単です。 –

+0

これは今、ありがとうございます。 – ddd

関連する問題