Spring context:component-scan: No such bean definition

Dieses Thema Spring - context:component-scan: No such bean definition im Forum "Application Tier" wurde erstellt von Boiorix, 21. März 2012.

Thema: context:component-scan: No such bean definition Hallo zusammen! Ich versuche den Component-Scan mit Spring zum laufen zu bekommen. Aus den Sourcen klappt das...

  1. Hallo zusammen!

    Ich versuche den Component-Scan mit Spring zum laufen zu bekommen.
    Aus den Sourcen klappt das auch. Wenn ich jetzt allerdings eine Version mit Jenkins baue und diese dann aus den Jars starte, bekomme ich eine NoSuchBeanDefinitionException.
    Er kann die angegebene Bean also nicht finden.

    Ich habe Klassen, welche mit @Component gekennzeichnet sind, und welche per @Autowired instanziiert werden.
    Schon beim instanziieren der ersten Bean im ApplicationContext gibts die Exception.

    Ich kann leider nur code-stücke oder Pseudo-Code posten, mehr darf ich nicht.

    Der Einstiegspunkt im Programmcode:

    Code (Java):

    ...
    GenericApplicationContext context = new GenericApplicationContext();
            XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(context);
            xmlReader.loadBeanDefinitions(new ClassPathResource("META-INF/ctx.xml"));
            context.refresh();

            mainController = context.getBean("MainController");
            ....

    Beispiel des MainControllers:

    Code (Java):
    @Component("MainController")
    public class MainController implements Observer {

        @Autowired
        private MainModel          model;
    ...
    }

    Die ctx.xml:
    [XML]<?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    Index of /schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    Index of /schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    Index of /schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">


    <context:component-scan base-package="package.package2"/>


    </beans>[/XML]
    Die mit @Component annotierten Klassen sind alle in verschiedenen Packages unter package2.

    Teile des Quellcodes werden obfuscated, die Klassen die mit @Component gekennzeichnet sind, werden von der obfuscation ausgeschlossen. Hab das in der erstellten Jar schon überprüft.
    Hab ich vielleicht noch irgendwas vergessen? Ich versteh einfach nicht, warum es aus Eclipse heraus läuft, aber nicht aus den JARs.

    Hat jemand vielleicht ne Idee, woran das liegen könnte?
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Die Vermutung liegt wohl nahe, dass es am Obfuscator liegt.

    Dein Pseudocode funktioniert bei mir wie erwartet.
     
  4. Du hast mit deiner Vermutung richtig gelegen!
    ProGuard optimiert noch den ganzen Quellcode und schmeisst Annotations raus!!!
    Annotations müssen wie folgend in der Proguard-Config eingetragen werden:

    Code (Text):


    -keepattributes *Annotation*
    -keepdirectories

    -keep @org.springframework.beans.factory.annotation.Component class *
    -keepclassmembers class * { @org.springframework.beans.factory.annotation.Autowired *; }

     
    So bleiben jetzt die Annotationen @Component und @Autowired beibehalten.
    Ob keepAttributes und -keepdirectories zwingend notwendig sind, weiss ich jetzt nicht.
    Denn wirklich funktioniert hat das ganze erst, mit dem Einfügen der anderen 2 Zeilen.
     
  5. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!