In your Spring bean you may have some fields for which you want to ensure that those fields have been populated. Spring framework has a @Required annotation to ensure that.
@Required annotation in Spring
The @Required annotation applies to bean property setter methods. This annotation simply indicates that the bean property annotated with the @Required annotation must be configured to be dependency-injected with a value, through an explicit property value in a bean definition or through autowiring.
If the property annotated with @Required annotation is not set, BeanInitializationException exception will be thrown.
For @Required annotation to work you also need to register RequiredAnnotationBeanPostProcessor that enforces required JavaBean properties to have been configured. Rather than directly registering RequiredAnnotationBeanPostProcessor preferred way is to include the <context:annotation-config/> tag in an XML-based Spring configuration. By using this tag following post-processors are implicitly registered AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor and RequiredAnnotationBeanPostProcessor.
You can also use <context:component-scan> if you are configuring your beans to be automatically discovered in Spring.
Example using @Required annotation
In this example there are two classes Person.java and Employee.java. In Employee class there is an object of Person class and also a field designation. Setter methods for both are marked as @Required.
Employee.java
import org.springframework.beans.factory.annotation.Required;
public class Employee {
private String designation;
private Person person;
public String getDesignation() {
return designation;
}
@Required
public void setDesignation(String designation) {
this.designation = designation;
}
public Person getPerson() {
return person;
}
@Required
public void setPerson(Person person) {
this.person = person;
}
public String toString(){
return "Name - " + person.getName() + "Age - " + person.getAge();
}
}
Person.java
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
XML Configuration
<?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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="employeeBean" class="org.netjs.exp.Spring_Example.Employee">
</bean>
<bean id="personBean" class="org.netjs.exp.Spring_Example.Person">
<property name="name" value="Ram" />
<property name="age" value="25" />
</bean>
</beans>
Here notice the inclusion of <context:annotation-config/> tag. You also need to include context namespace for the same.
In the configuration values for the properties in employeeBean are not set. Since these fields are marked as @Required so you should get an exception.
You can run the code using the following Java class.
public class App {
public static void main( String[] args ){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext
("appcontext.xml");
}
}
As expected BeanInitializationException exception is thrown.
Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeBean' defined in class path resource [appcontext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Properties 'designation' and 'person' are required for bean 'employeeBean'
Now let’s correct the configuration file and add the properties with value.
<?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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="employeeBean" class="org.netjs.exp.Spring_Example.Employee">
<property name="person" ref="personBean" />
<property name="designation" value="Manager" />
</bean>
<bean id="personBean" class="org.netjs.exp.Spring_Example.Person">
<property name="name" value="Ram" />
<property name="age" value="25" />
</bean>
</beans>
Now if you run it using the following Java class.
public class App {
public static void main( String[] args ){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext
("appcontext.xml");
Employee emp = (Employee)context.getBean("employeeBean");
System.out.println("Employee Name " + emp.getPerson().getName());
}
}
Output
Employee Name Ram
That's all for this topic @Required Annotation in Spring Framework. If you have any doubt or any suggestions to make please drop a comment. Thanks!
Related Topics
You may also like -