2017-05-26 8 views
0

にapplication.propertiesから値をロードできません:は、私は次のような構造を持つスプリングブートRESTサービスを持って春のブートサービス

├── src 
│   ├── main 
│   │   ├── java 
│   │   │   ├── daos 
│   │   │   ├── db 
│   │   │   │   └── DBConnector.java 
│   │   │   ├── serviceComponents 
│   │   │   │   └── serviceResources 
│   │   │   │    ├── Application.java 
│   │   │   │    ├── UserController.java 
│   │   │   │    └── UserDAO.java 
│   │   │   └── serviceRepresentations 
│   │   │    └── User.java 
│   │   └── resources 
│   │    └── application.properties 

この質問に関連する主なファイルは以下のとおりです。

Application.java

package serviceComponents.serviceResources; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration; 
import org.springframework.context.annotation.ComponentScan; 

@SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class}) 
@ComponentScan 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

DBConnector.java

package db; 

import java.sql.Connection; 
import java.sql.SQLException; 

import oracle.jdbc.pool.OracleDataSource; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 

import javax.annotation.PostConstruct; 


@Component 
public class DBConnector { 
    @Value("${current.app.url}") 
    String dbUrl; 

    @Value("${current.app.sid}") 
    String dbSid; 

    @Value("${current.app.port}") 
    String dbPort; 

    @Value("${current.app.user}") 
    String dbUser; 

    @Value("${current.app.password}") 
    String dbPassword; 

    String jdbcUrl = String.format("jdbc:oracle:thin:@%s:%s:%s", dbUrl, dbPort, dbSid); 
    Connection conn; 

    int count = 0; 

    public DBConnector() {} 

    @PostConstruct 
    private void init() { 

     try { 
      Class.forName("oracle.jdbc.OracleDriver"); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
     OracleDataSource ds = null; 

     try { 
      ds = new OracleDataSource(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

     ds.setURL(jdbcUrl); 

     try { 
      conn = ds.getConnection(dbUser, dbPassword); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public Connection getDBConnection() throws SQLException { 
     if (count == 0) { 
      init(); 
      count++; 
     } 

     return conn; 
    } 
} 

そしてpropertiesファイル:

server.port = 8089 

test.app.url = 127.0.0.1 
test.app.sid = XE 
test.app.port = 1521 
test.app.user = foouser 
test.app.password = barbazpass 

current.app.url = test.app.url 
current.app.sid = test.app.sid 
current.app.port = test.app.port 
current.app.user = test.app.user 
current.app.password = test.app.password 

とコントローラからのコードの関連する部分があります:

@RestController 
@RequestMapping("/v1/user/") 
public class UserController { 

    DBConnector dbConnector = new DBConnector(); 
    UserDAO userDAO = new UserDAO(dbConnector); 

私は、アプリケーションを実行するときしかし、@ValueでアノテートDBConnector.javaからのフィールドがされています構成ファイルの期待値が入力されていません。私は、春のブートがapplication.propertiesをプロジェクトのデフォルト設定ファイルとして検出することを知っています。私は間違って何をしていますか?

+0

どのように 'DBConnector'のインスタンスを取得していますか?そのパッケージが 'db'であり、あなたが' serviceComponents.serviceResources'でコンポーネントをスキャンしているとすれば、Springはそれについて全く知らないでしょう。 –

+0

質問をコントローラからスニペットで更新しました。基本的に私はコントローラに 'DBConnector'のインスタンスを作成します。 – cristid9

答えて

1

おそらく@Autowiredでそれを試してみてください。

@Autowired DBConnector dbConnector = new DBConnector(); 

私は、我々は異なるあなたの注釈の一部と現在の春アプリが、私はきた問題の原因となった唯一の部品を交換しようとしましたあなたが経験しているのと同じ問題ではないかもしれないが、おそらくNullPointerExceptionはコントローラの@Autowiredアノテーションを削除したときだった。

EDIT:私は気づいていませんでしたが、インスタンス化していない参照をオートワイヤリングするだけなので、明らかにNPEが発生しています。あなたのために、同等のは次のようになります。

@Autowired DBConnector dbConnector; 

EDIT 2:私のアプリケーションは、まさにあなたのようにインスタンス化されていないので、これは動作しないかもしれないが、私はこのようなクラスを持っている:

@SpringBootApplication 
public class ParameterClassConfigurator 
{ 
    @Value("${my.first.property}") String property1; 
    @Value("${my.second.property}") String property2; 

    @Bean 
    public ParameterClass parameterClass() 
    { 
     ParameterClass params = new ParameterClass(property1, property2); 
     return params; 
    } 
} 

キーは@Beanアノテーションのようです。それがなければ、私のSpringブートアプリケーションは起動せず、org.springframework.beans.factory.UnsatisfiedDependencyExceptionをスローします。

+0

それは私に言う: "autowireできませんでした。 'DBConnector'タイプの豆が見つかりませんでした。 – cristid9

+0

@ cristid9「編集2」で自分の答えを編集しました。これはあなたのために働きますか? –

+0

したがって、 'ParameterClass'は' application.properties'のフィールドのコンテナですか? – cristid9

関連する問題