Home > Enterprise >  How to Read Array of Object from YAML file in Spring
How to Read Array of Object from YAML file in Spring

Time:08-26

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 !

CodePudding user response:

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;

CodePudding user response:

If you must use map. I think array of map are probably not what you desired. Maybe you need one map which contains two keys, username1 and username2. The following might let you know how to obtain the map.

The yml file content is like that.

secrets: "{username1:pw1,username2:pw1}"

The Java code field is like that.

  @Value("#{${secrets}}")
  public Map<Integer,Integer> secrets;
  • Related