java annotation on class FIELD is not working

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

Answers (1)

nicholas.hauschild
nicholas.hauschild

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

Related Questions