@Required
annotation applied on bean property methods. It makes sure that bean property
must be populated at configuration time, through an explicit property value in
a bean definition or through autowiring.
Author.java
package com.sample.pojo; public class Author{ private String firstName; private String lastName; private String dateOfBirth; private String country; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getDateOfBirth() { return dateOfBirth; } public void setDateOfBirth(String dateOfBirth) { this.dateOfBirth = dateOfBirth; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Author [firstName=").append(firstName).append(", lastName=").append(lastName) .append(", dateOfBirth=").append(dateOfBirth).append(", country=").append(country).append("]"); return builder.toString(); } }
Book.java
package com.sample.pojo; import org.springframework.beans.factory.annotation.Required; public class Book { private String title; private int noOfPages; private float price; private Author author; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getNoOfPages() { return noOfPages; } public void setNoOfPages(int noOfPages) { this.noOfPages = noOfPages; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public Author getAuthor() { return author; } @Required public void setAuthor(Author author) { this.author = author; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Book [title=").append(title).append(", noOfPages=").append(noOfPages).append(", price=") .append(price).append(", author=").append(author).append("]"); return builder.toString(); } }
Notify
‘setAuthor’ method, it is annotated with @Required annotation. Application must
provide the author reference at the time of Book bean initialization.
myConfiguration.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: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.xsd"> <context:annotation-config /> <bean id="osho" class="com.sample.pojo.Author"> <property name="firstName" value="Chandra Mohan" /> <property name="lastName" value="Jain" /> <property name="dateOfBirth" value="11 December 1931" /> <property name="country" value="India" /> </bean> <bean id="book1" class="com.sample.pojo.Book"> <property name="title" value="Vedanta An Art of Dying" /> <property name="noOfPages" value="164" /> <property name="price" value="90" /> <property name="author" ref="osho" /> </bean> </beans>
HelloWorld.java
package com.sample.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.sample.pojo.Book; public class HelloWorld { public static void main(String args[]) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "myConfiguration.xml" }); Book book = context.getBean("book1", Book.class); System.out.println(book); ((ClassPathXmlApplicationContext) context).close(); } }
Run
‘HelloWorld.java’, you can able to see following output.
Book [title=Vedanta An Art of Dying, noOfPages=164, price=90.0, author=Author [firstName=Chandra Mohan, lastName=Jain, dateOfBirth=11 December 1931, country=India]]
To
confirm the usage of Required annotation, Remove the author property from book1
bean definition.
<bean id="book1"
class="com.sample.pojo.Book">
<property
name="title" value="Vedanta An Art of Dying" />
<property
name="noOfPages" value="164" />
<property
name="price" value="90" />
</bean>
Update
myConfiguration.xml file like below.
myConfiguration.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: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.xsd"> <context:annotation-config /> <bean id="osho" class="com.sample.pojo.Author"> <property name="firstName" value="Chandra Mohan" /> <property name="lastName" value="Jain" /> <property name="dateOfBirth" value="11 December 1931" /> <property name="country" value="India" /> </bean> <bean id="book1" class="com.sample.pojo.Book"> <property name="title" value="Vedanta An Art of Dying" /> <property name="noOfPages" value="164" /> <property name="price" value="90" /> </bean> </beans>
Re
run ‘HelloWorld.java’, you can able to see following error in console.
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'book1' defined in class path resource [myConfiguration.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Property 'author' is required for bean 'book1' at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:751) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93) at com.sample.test.HelloWorld.main(HelloWorld.java:10) Caused by: org.springframework.beans.factory.BeanInitializationException: Property 'author' is required for bean 'book1' at org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.postProcessPropertyValues(RequiredAnnotationBeanPostProcessor.java:156) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1219) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ... 11 more
Why do we need
@Require annotation?
By
specifying the @Required annotation on a property, we can avoid
NullPointerException.
No comments:
Post a Comment