Home > Net >  class path resource [application.yml] cannot be opened because it does not exist Maven, SpringBoot
class path resource [application.yml] cannot be opened because it does not exist Maven, SpringBoot

Time:11-14

I have created multimodule project with SpringBoot and Maven.

I have changed application.properties file to application.yml file.

Application.yml file is inside src/main/resources

In service class, I am trying to do

@Value("${keycloak.realm}")
private String REALM;

The first error that I have is:

Could not resolve placeholder 'keycloak.realm' in value "${keycloak.realm}"

When I place @PropertySource(value = "classpath:application.yml") annotation to same service that is calling @Value annotation I am getting following error:

class path resource [application.yml] cannot be opened because it does not exist

Here is service class:

@Slf4j
@Service
@PropertySource(value = "classpath:application.yml")
@RequiredArgsConstructor
public class KeyCloakServiceImpl implements KeyCloakService {

    @Value("${keycloak.realm}")
    private String REALM;

What am I missing here?

CodePudding user response:

By default, @PropertySource doesn't look for yaml files. To do it, you have to tell @PropertySource to load a yaml file with the factory property :

@PropertySource(value = "classpath:foo.yml", factory = YamlFactory.class)
public class SomeClass() { }

Where an implementation of YamlFactory.class can be :

public class YamlFactory implements PropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) 
      throws IOException {
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        factory.setResources(encodedResource.getResource());

        Properties properties = factory.getObject();

        return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
    }
}

For more information : https://www.baeldung.com/spring-yaml-propertysource

  • Related