Problema Spring Framework Semplice

di il
7 risposte

Problema Spring Framework Semplice

Ciao a tutti. Sto imparando a usare Spring. Per ora sto provando lo spring "semplice" non Mvc. Fino ad ora ho provato esempi con il file Beans.xml, adesso sto iniziando con le annotazioni.
E' un programma molto semplice, eppure non mi funziona. Mi dà un errore. Metto qua il Programma. Spero nel vostro aiuto. Grazie

MAIN:

package marco.myexample.a_config;

import java.util.Scanner;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

	public static void main(String [] args)
	{
		AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext();

	    context.register(HelloWorldConfig.class);
	
	    
		HelloWorld obj=(HelloWorld) context.getBean(HelloWorld.class);
		
		System.out.println("INSERISCI LA PAROLA");
		
		Scanner input=new Scanner(System.in);
		String message=input.nextLine();
		
		obj.setMessage(message);
		obj.getMessage();
	}
}

HELLOWORLD

package marco.myexample.a_config;

/* Classe HelloWorld, gli oggetti istanza di tale classe verranno registrati
 * come bean nel contesto di Spring grazie alla classe HelloWorldConfig
 */

public class HelloWorld {

	private String message;

	public void getMessage() {
		System.out.println("Il nome è: "+message);
	}

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

}
HelloWorldConfig

package marco.myexample.a_config;

import org.springframework.context.annotation.*;


/* La classe viene usata dal container di Spring come una sorgente di
 * definizione di bean */
    
@Configuration
public class HelloWorldConfig {

	/* Il metodo ritorna un oggetto che deve essere registrato come un
     * bean nel contesto di Spring */
	
	@Bean
	public HelloWorld helloWorld()
	{
		return new HelloWorld();
	}
}

L'errore che mi da è
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [marco.myexample.a_config.HelloWorld] is defined: expected single bean but found 0: 
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:271)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1101)
	at marco.myexample.a_config.Main.main(Main.java:17)
Grazie mille per l'aiuto

7 Risposte

  • Re: Problema Spring Framework Semplice

    marco94 ha scritto:


    Fino ad ora ho provato esempi con il file Beans.xml, adesso sto iniziando con le annotazioni.
    E' un programma molto semplice, eppure non mi funziona. Mi dà un errore. Metto qua il Programma. Spero nel vostro aiuto. Grazie
    Uso quotidianamente Spring ma AnnotationConfigApplicationContext non l'ho mai usata direttamente (fare applicazioni standalone così vale solo come esempio/prova "didattica")

    Comunque dalla documentazione javadoc di register:

    public void register(Class<?>... annotatedClasses)

    Register one or more annotated classes to be processed. Note that AbstractApplicationContext.refresh() must be called in order for the context to fully process the new class.


    E questo "quadra" con il messaggio di errore: dice che non trova il tuo bean HelloWorld (dice found 0) perché appunto non ha ancora "tirato su" nulla.
  • Re: Problema Spring Framework Semplice

    Grazie !
    Cosa dovrei usare ? Nel senso, come devo modificarlo per farlo andare ?
  • Re: Problema Spring Framework Semplice

    marco94 ha scritto:


    Cosa dovrei usare ? Nel senso, come devo modificarlo per farlo andare ?
    refresh() sul quel tuo context.

    (refresh() infatti è di AbstractApplicationContext super classe di AnnotationConfigApplicationContext)
  • Re: Problema Spring Framework Semplice

    Scusa se ti stresso

    Inserendo context.refresh();
     AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext();
          context.refresh();
          context.register(HelloWorldConfig.class);
    mi da errore
    Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
    ago 04, 2015 12:14:07 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFORMAZIONI: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2c618b08: startup date [Tue Aug 04 12:14:06 CEST 2015]; root of context hierarchy
    ago 04, 2015 12:14:07 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFORMAZIONI: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@669b5cdb: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
    Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [marco.myexample.a_config.HelloWorld] is defined: expected single bean but found 0: 
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:271)
    	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1101)
    	at marco.myexample.a_config.Main.main(Main.java:19)


    Se Metto
     AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext();
        
          context.register(HelloWorldConfig.class);
          context.refresh();
    mi dà:
    
    Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
    ago 04, 2015 12:17:51 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFORMAZIONI: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2c618b08: startup date [Tue Aug 04 12:17:51 CEST 2015]; root of context hierarchy
    Exception in thread "main" java.lang.IllegalStateException: CGLIB is required to process @Configuration classes. Either add CGLIB to the classpath or remove the following @Configuration bean definitions: [helloWorldConfig]
    	at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:327)
    	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:222)
    	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
    	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:620)
    	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446)
    	at marco.myexample.a_config.Main.main(Main.java:16)
  • Re: Problema Spring Framework Semplice

    marco94 ha scritto:


    scusa se ti stresso

    Inserendo context.refresh();
     AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext();
          context.refresh();
          context.register(HelloWorldConfig.class);
    refresh dopo il register!

    Prima gli dici di registrare una classe per la configurazione (ma fin qui non fa ancora nulla di reale), poi rinfreschi il contesto in modo che "tiri su" la configurazione in base al tipo di contesto (nel tuo caso da classi annotate, appunto essendo AnnotationConfigApplicationContext).
  • Re: Problema Spring Framework Semplice

    Grazie mille ora funziona
  • Re: Problema Spring Framework Semplice

    In alternativa, passa la classe direttamente al costruttore:

    AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(HelloWorldConfig.class);

    Infatti la documentazione del costruttore dice: [...] and automatically refreshing the context.


    P.S: L'uso di AnnotationConfigApplicationContext è BEN descritto nel reference ufficiale:
    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-java-instantiating-container

Devi accedere o registrarti per scrivere nel forum
7 risposte