Search code examples
javaarraysspringyamlspring-annotations

How to Read Array of Object from YAML file in Spring


We are working on Spring based application which needs to access and read certain credentials stored in the yaml file which use the format below:

#yaml file content
...
secrets: username1:pw1, username2:pw2
...

we load the yaml file using PropertySource annotation like this

@PropertySources({
        @PropertySource(value = "file:/someSecretPath/secrets.yaml", ignoreResourceNotFound = true) // secret yaml file
})

I have tried using the following code to parse it into array of map object since it is a list contains 2 object type,

@Repository
public class getSecretClass {
  
    @Value("${secrets}")
    private Map<String,String>[] credentials;
}

but it fails with this error:

... 'java.lang.string' cannot be converted into java.lang.map[] ....

On the other hand, I tested reading from simple string array like this one:

#yaml file content
...
secrets: text1, text2
...

and the code below would work with no issue:

@Repository
public class getSecretClass {
  
    @Value("${secrets}")
    private String[] credentials;

    ...
    private someReadSecretMethod(){
       System.out.println( credentials[0] );
    } 

}

it will print "text1" as expected. But we do need to store the credentials as pairs in my use case, a plain text would not work for me.

Any suggestion or advice would be much appreciated !


Solution

  • Why not do something easier on the eyes, easier to program if not a little verbose:

    secrets:
    - username: username1
      password: pwd1
    - username: username2
      password: pwd2
    

    Have a class for your secret:

    public class Secret {
      private String username;
      private String password;
    
      public String toString() { return username + ":" password; }
    }
    

    And then injects as

    @Value("${secrets}")
    List<Secret> secrets;