Reputation: 43
I am checking spring dependency with custom annotation I have created a custom annotation in java, and I am applying this to a FIELD
. Its working on METHOD
but not on FEILD
my custom annotation is class is
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Mandatory {
}
My target class is:
public class Student {
@Mandatory
int salary;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
and my spring-configuration file is
<?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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config />
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor">
<property name="requiredAnnotationType" value="com.spring.core.annotation.Mandatory"/>
</bean>
<bean id="student" class="com.spring.core.annotation.Student">
<!-- <property name="salary" value="200000"></property> -->
</bean>
</beans>
my app class is
public class App {
public static void main(String[] args) {
ApplicationContext context= new ClassPathXmlApplicationContext("annotations.xml");
Student stud= (Student)context.getBean("student");
System.out.println(stud);
}
}
output is :Student [salary=0]
expected: it should throw exception property salary
required
Upvotes: 4
Views: 1277
Reputation: 42834
According to the JavaDoc, the RequiredAnnotationBeanPostProcessor
looks at property setter methods, and not the property fields themselves.
The motivation for the existence of this BeanPostProcessor is to allow developers to annotate the setter properties of their own classes with an arbitrary JDK 1.5 annotation to indicate that the container must check for the configuration of a dependency injected value.
The emphasized portion is slightly confusing, so I confirmed by looking at the @Required
annotations JavaDoc, which is the default annotation the RequiredAnnotationBeanPostProcessor
checks for. You should notice that the @Target
meta-annotation only references METHOD (not FIELD), and the JavaDoc mentions the following:
Marks a method (typically a JavaBean setter method) as being 'required': that is, the setter method must be configured to be dependency-injected with a value.
Upvotes: 3