-2

I am pretty new in Spring and I have the following problem.

I am implement a Spring console application (this is not a web app) that perform some query on the database and I have the following configuration:

  1. A beans.xml file containing the beans definition:

     <context:component-scan base-package="it.mycompany.myapp.profilatura.service" />
    
     <!-- bean definitions here -->
     <bean id="helloWorld" class="HelloWorld">
        <property name="message" value="Hello World!"/>
     </bean>
    

As you can see in this file I have also specified that the application have tho scan the it.mycompany.myapp.profilatura.service package that will contain classes annoted with @Service annotation, by this line:

<context:component-scan base-package="it.mycompany.myapp.profilatura.service" />

So this is my MainApp class that contain the main() method and that start the application:

public class MainApp {
    
    @Autowired
    private static UtenteLoggatoService utenteLoggatoService;
    
    public static void main(String[] args) {
       
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      
        HelloWorld obj = (HelloWorld) context.getBean("helloWorld");

        obj.getMessage();
        
        utenteLoggatoService.getInfoUtenteLoggato();
   }
}

As you can see, at the end, it perform this method call:

utenteLoggatoService.getInfoUtenteLoggato();

and this is the autowired UtenteLoggatoService class:

@Service
@Transactional(rollbackFor={Exception.class})
public class UtenteLoggatoService {
    
    public String getInfoUtenteLoggato() {
        return "TEST";
    }

}

The problem is that when I perform this application I obtain this error message into my stacktrace:

Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 8 in XML document from class path resource [Beans.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 74; The prefix "context" for element "context:component-scan" is not bound.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:399)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:452)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at MainApp.main(MainApp.java:14)
Caused by: org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 74; The prefix "context" for element "context:component-scan" is not bound.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:284)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:290)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2787)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
    ... 14 more

What am I missing? How can I solve this issue and use the UtenteLoggatoService into the MainApp class?

halfer
  • 19,824
  • 17
  • 99
  • 186
AndreaNobili
  • 40,955
  • 107
  • 324
  • 596

1 Answers1

-1

I soled by myself looking at the documentation:

So I have this beans.xml file:

<?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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">


    <context:component-scan base-package="it.mycompany.myproject.profilatura.app" />
    <context:component-scan base-package="it.hp.miur.profilatura.service" />

    <!-- bean definitions here -->
    <bean id="helloWorld" class="it.mycompany.myproject.profilatura.app.HelloWorld">
       <property name="message" value="Hello World!"/>
    </bean>

</beans>

And this MainApp class:

@Component
public class MainApp {

    @Autowired
    private UtenteLoggatoService utenteLoggatoService;

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

        MainApp app = context.getBean(MainApp.class);

        app.start();

        //HelloWorld obj = (HelloWorld) context.getBean("helloWorld");

        //obj.getMessage();


   }  

    private void start() {
        System.out.println("APPLICATION STARTED");
        System.out.println(utenteLoggatoService.getInfoUtenteLoggato());
    }

}

So it work, I think that it is the most common solution

Doing in this way the MainApp class is a Spring component and I instanciate it as a Spring bean so I can autowire another bean (as UtenteLoggatoService utenteLoggatoService) that is inside the context taking it from the context.

AndreaNobili
  • 40,955
  • 107
  • 324
  • 596