Search code examples
springeclipseannotationsapplication.properties

Using Spring @Value annotation results in field not initialized error in Eclipse


I am currently developing a Spring Boot application in the Eclipse IDE with a Connection class which needs to know which data source to connect to. I decided to let it know this property from Spring's application.properties, through the @Value annotation:

@Value("${project.datasource}")
private final DataSource DATA_SOURCE;

where DataSource is an enum representing the possible data sources. However, in this method, I get a "Blank final field DATA_SOURCE may not have been initialized" error:

private DBConnection() throws SQLException {
    ConnectionConfig config = new ConnectionConfig(DATA_SOURCE);
    connection = DriverManager.getConnection(config.getUrl(), config.getUSERNAME(), config.getPASSWORD());
}

Inserting a default value doesn't work, either:

@Value("${project.datasource:POSTGRE_LOCAL}")

still gives the same error. I tried to install the Spring Tools 4 plugin for Eclipse to check if this was just Eclipse not understanding the @Value annotation's implications, but it seems like this isn't the case. How do I solve this problem? Am I misunderstanding the implications myself?

application.properties:

project.datasource = POSTGRE_LOCAL

Project tree:

|   .classpath
|   .gitignore
|   .project
|   HELP.md
|   mvnw
|   mvnw.cmd
|   pom.xml
|   
+---.mvn
|   \---wrapper
|           maven-wrapper.jar
|           maven-wrapper.properties
|           
+---.settings
|       org.eclipse.core.resources.prefs
|       org.eclipse.jdt.core.prefs
|       org.eclipse.m2e.core.prefs
|       org.springframework.ide.eclipse.prefs
|       
+---src
|   +---main
|   |   +---java
|   |   |   \---org
|   |   |       \---ingsw21
|   |   |           \---backend
|   |   |               +---connection
|   |   |               |       DBConnection.java
|   |   |               |       
|   |   |               +---controllers
|   |   |               |       UserController.java
|   |   |               |       
|   |   |               +---DAOs
|   |   |               |       DAOUtente.java
|   |   |               |       
|   |   |               +---DAOSQL
|   |   |               |       DAOSQLUtente.java
|   |   |               |       
|   |   |               +---entities
|   |   |               |       Utente.java
|   |   |               |       
|   |   |               +---enums
|   |   |               |       DataSource.java
|   |   |               |       
|   |   |               \---exceptions
|   |   |                       BadRequestWebException.java
|   |   |                       DataAccessException.java
|   |   |                       
|   |   \---resources
|   |           application.properties
|   |           
|   \---test
|       \---java
|           \---org
|               \---ingsw21
|                   \---backend
|                       \---BackEnd
|                               BackEndApplicationTests.java
|                               
\---target
    +---classes
    |   |   application.properties
    |   |   
    |   \---org
    |       \---ingsw21
    |           \---backend
    |               +---connection
    |               |       DBConnection$ConnectionConfig.class
    |               |       DBConnection.class
    |               |       
    |               +---controllers
    |               |       UserController.class
    |               |       
    |               +---DAOs
    |               |       DAOUtente.class
    |               |       
    |               +---DAOSQL
    |               |       DAOSQLUtente.class
    |               |       
    |               +---entities
    |               |       Utente.class
    |               |       
    |               +---enums
    |               |       DataSource.class
    |               |       
    |               \---exceptions
    |                       BadRequestWebException.class
    |                       DataAccessException.class
    |                       
    \---test-classes
        \---org

Solution

  • You cannot add @Value to a final field.

    @Value("${project.datasource}")
    private DataSource DATA_SOURCE;
    

    should work just fine.