I have written a very simple Spring application with eclipse to inject a property in a bean.I have also updated the ClassPath variable in windows to add the path for my spring configuration file. .
Workaround for bean.xml not found issue after Maven build
After that, run the Java application once again in Eclipse, s trange issue occurs: Spring complains the beans.xml does not exist in ClassPath!! .
Spring cannot find bean xml configuration file when it does exist
Since I get many people thumbs up for the solution and had had first experience with Spring as student few years ago, I feel desire to explain shortly why it works.This is a convention respected by many tools like maven or sbt in process of building project (note: as a default configuration!).When code (from the post) was in running mode, it couldn't find nothing like "src/main/resources/beans.xml" due to the fact, that beans.xml was in the root of jar (copied to /beans.xml in created jar/ear/war).When using ClassPathXmlApplicationContext, the proper location declaration for beans xml definitions, in this case, was "/beans.xml", since this is path where it belongs in jar and later on in classpath. .
How to define beans in spring
We will use maven to manage the spring dependencies and eclipse to build and run the code.Spring-beans module provides org.springframework.beans.factory.BeanFactory interface which is required to work with spring beans.Spring-context module provides org.springframework.context.ApplicationContext interface which enables additional features such as message resources, AOP capabilities, specific types of application contexts and bean lifecycle event listeners. The article will discuss the most common causes of this exception along with the solution for each one.IOException Parsing XML Document From ServletContext Resource.By default, Spring will look for a file called exactly springMvcServlet-servlet.xml in the /WEB-INF directory of the web application.The solution is of course to make sure the mvc-servlet.xml file indeed exists under /WEB-INF; if it doesn't, then a sample one can be created:.IOException Parsing XML Document From Class Path Resource.This usually happens when something in the application points to an XML resource that doesn't exist, or is not placed where it should be.This error occurs when Spring tries to resolve a property but is not able to – for one of many possible reasons.A good best practice to follow is to have all properties files under the /src/main/resources directory of the application and to load them up via:.If that is the case, then the solution is either collapsing these into a single one, or configuring the one in the parent context with ignoreUnresolvablePlaceholders.Similarly, the exception is not restricted to the MutablePropertyValues bean – there are several other incarnations of the same problem, caused by the same version inconsistency:.A common problem, similarly related to Maven and the existing Spring dependencies is:.The NoClassDefFoundError means that the Spring Transactional support – namely spring-tx – does not exist on the classpath.Of course this is not limited to the transaction functionality – a similar error is thrown if AOP is missing as well:.At the end of this article, we should have a clear map to navigate the variety of causes and problems that may lead to a Bean Definition Store Exception as well as a good grasp on how to fix all of these problems. . The examples included below will hopefully convince you that the inclusion of XML Schema support in Spring 2.0 was a good idea.The reception in the community has been encouraging; also, please note the fact that this new configuration mechanism is totally customisable and extensible.This means you can write your own domain-specific configuration tags that would better represent your application’s domain; the process involved in doing so is covered in the appendix entitled Chapter 41, Extensible XML authoring .That’s great news for the Spring IoC container, because if everything is a bean then everything can be treated in the exact same fashion.The objects defined in a Spring XML configuration file are not all generic, vanilla beans.Regardless of whether the XML configuration is DTD- or Schema-based, in the end it all boils down to the same object model in the container (namely one or more BeanDefinition instances).However, the entire point of switching over is to take advantage of the new Spring 2.0 XML tags since they make configuration easier.This is all well and good, but it is a tad verbose and (unnecessarily) exposes Spring’s internal plumbing to the end user.The following XML Schema-based version is more concise and clearly expresses the developer’s intent ('inject this constant value'), and it just reads better. FileSystemXmlApplicationContext − This container loads the definitions of the beans from an XML file.Here you need to provide the full path of the XML bean configuration file to the constructor.ClassPathXmlApplicationContext − This container loads the definitions of the beans from an XML file.WebXmlApplicationContext − This container loads the XML file with definitions of all beans from within a web application.Let us have a working Eclipse IDE in place and take the following steps to create a Spring application −.The FileSystemXmlApplicationContext() API takes care of creating and initializing all the objects ie.The second step is used to get the required bean using getBean() method of the created context.Once you are done with creating the source and bean configuration files, let us run the application. . Spring 3.0 introduced JavaConfig, allowing us to configure beans using Java classes.To use it in a Spring Boot application, we can use the @ImportResource annotation, telling it where to find the configuration file:[email protected] @ImportResource("classpath:beans.xml") public class SpringBootXmlApplication implements CommandLineRunner { @Autowired private Pojo pojo; public static void main(String[] args) { SpringApplication.run(SpringBootXmlApplication.class, args); } }.Unfortunately, this test will fail because, by default, the XML configuration file can't resolve [email protected] @EnableAutoConfiguration @ImportResource("classpath:beans.xml") public class SpringBootXmlApplication implements CommandLineRunner { // ... }.First, configuring the beans in Java is type-safe, so we'll catch type errors at compile time.In this article, we saw how to use XML configuration files to define our beans in a Spring Boot application. . In order to avoid full file-system paths in a Tomcat configuration, you make all the file references point to elements on the classpath.If you do this and run Tomcat you will get an error similar to:This problem occurs because Tomcat is running as a separate application with its own environment - an environment that does not include classpath links to your other Eclipse projects (even though you have linked them together in Eclipse). . The Spring Framework core is, simply put, an IoC container used to manage beans.There are two basic types of containers in Spring – the Bean Factory and the Application Context.The former provides basic functionalities, which are introduced here; the latter is a superset of the former and is most widely used.ClassPathXmlApplicationContext can load an XML configuration from a classpath and manage its beans:.In that case, we simply need to add several configuration locations when constructing the ApplicationContext:.When we use Spring IoC container in a web application, Spring’s web-based ApplicationContext implementations will shut down the container gracefully when the application is shut down, but if we use it in a non-web environment, such as a standalone desktop application, we have to register a shutdown hook with the JVM by ourselves to make sure the Spring IoC container is shut down gracefully and calls the destroy methods to release [email protected] public void testRegisterShutdownHook() { ConfigurableApplicationContext context = new ClassPathXmlApplicationContext( "classpathxmlapplicationcontext-example.xml"); context.registerShutdownHook(); }.Sometimes we need to obtain the reference of ApplicationContext inside the beans managed by it, we can use ApplicationContextAware or @Autowired to do this.public class Course { private String name; // standard constructors, getters and setters }.We have a Teacher class which assembles its courses according to the container's beans:.public class Teacher implements ApplicationContextAware { private ApplicationContext context; private ListSpring BeanDefinitionStoreException
40. XML Schema-based configuration
Spring ApplicationContext Container
XML Defined Beans in Spring Boot
Adding multiple Eclipse projects to Tomcat's classpath
Intro to Spring ClassPathXmlApplicationContext