32

My very basic spring application stopped working and I can't understand what's happened. pom.xml:

<properties>
    <spring.version>4.1.1.RELEASE</spring.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
</dependencies>

Config class:

@Configuration
public class MyConfig {

@Bean
public HelloWorld helloWorld() {
         return new HelloWorld();
    }
}

Bean class:

public class HelloWorld {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }
    public String getMessage() {
         return message;
    }
}

Entry point of application:

public class MainApp {
public static void main(String[] args) {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.register(MyConfig.class);
    HelloWorld bean = ctx.getBean(HelloWorld.class);
    bean.setMessage("ladjfaj");
    System.out.println(bean.getMessage());
}
}

And I'm getting an error

Exception in thread "main" java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@6ebf8cf5 has not been refreshed yet at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:943) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:967) at com.nikolas.config.MainApp.main(MainApp.java:12)

Nikolas
  • 2,322
  • 9
  • 33
  • 55

3 Answers3

33

You have to call ctx.refresh() before you can call ctx.getBean(HelloWorld.class);

Jens
  • 67,715
  • 15
  • 98
  • 113
  • Thanks, it works! Is it necessary to call **ctx.registerShutdownHook();** for proper schutdown the container? – Nikolas Feb 09 '15 at 07:39
  • @Nikolas I do not think so. – Jens Feb 09 '15 at 07:40
  • 1
    This link can be useful https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/AnnotationConfigApplicationContext.html#register-java.lang.Class...- – Nikolas Nov 04 '17 at 19:30
16

If you dont want to call ctx.refresh() explicitly, just initialize ApplicationContext like this: new AnnotationConfigApplicationContext(MyConfig.class), then configuration will be registered and refreshed implicitly

1

Just in case someone has a similar issue and can´t relate directly to the example above, this may help:

I ran into the problem when I had one of my repositories outside of the folder that was included in

@EnableJpaRepositories(basePackages = {"com.myproject.repositores"})

Which lead to this first exception:

Description: Field profileRepository in com.myproject.featurepackage.config.ProfileService required a bean of type 'com.myproject.featurepackage.ProfileRepository' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true)

When I afterwards accessed the ApplicationContext to instanciate a bean, I ran into the error

org.springframework.context.annotation.AnnotationConfigApplicationContext@4983159f has not been refreshed yet

Marian Klühspies
  • 15,824
  • 16
  • 93
  • 136