注释反射(使用getAnnotation)不起作用



我必须遵循以下代码来检查model中的实体在字段上是否有nullable=false或类似的注释。

import javax.persistence.Column;
import .....
private boolean isRequired(Item item, Object propertyId) {
        Class<?> property = getPropertyClass(item, propertyId);
        final JoinColumn joinAnnotation = property.getAnnotation(JoinColumn.class);
        if (null != joinAnnotation) {
            return !joinAnnotation.nullable();
        }
        final Column columnAnnotation = property.getAnnotation(Column.class);
        if (null != columnAnnotation) {
            return !columnAnnotation.nullable();
        }
        ....
        return false;
    }

这是我的模型中的一个片段。

import javax.persistence.*;
import .....
@Entity
@Table(name="m_contact_details")
public class MContactDetail extends AbstractMasterEntity implements Serializable {
    @Column(length=60, nullable=false)
    private String address1;

对于那些不熟悉@Column注释的人,这里有标题:

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface Column {

我希望isRequired时不时地返回true,但它从来没有这样做过。我已经为我的项目做了mvn cleanmvn install,但这没有帮助。

Q1:我做错了什么?

Q2:有没有一种更干净的方法来编码isRequired(也许可以更好地利用泛型)?

  1. property表示一个类(它是一个Class<?>
  2. CCD_ 11和CCD_ 12只能对字段/方法进行注释

因此,您永远不会在property上找到这些注释。

一个稍微修改过的代码版本,可以打印出是否需要Employee实体的电子邮件属性:

public static void main(String[] args) throws NoSuchFieldException {
      System.out.println(isRequired(Employee.class, "email"));
}
private static boolean isRequired(Class<?> entity, String propertyName) throws NoSuchFieldException {
    Field property = entity.getDeclaredField(propertyName);
    final JoinColumn joinAnnotation = property.getAnnotation(JoinColumn.class);
    if (null != joinAnnotation) {
        return !joinAnnotation.nullable();
    }
    final Column columnAnnotation = property.getAnnotation(Column.class);
    if (null != columnAnnotation) {
        return !columnAnnotation.nullable();
    }
    return false;
}

请注意,这是一个半生不熟的解决方案,因为JPA注释可以在字段上,也可以在方法上。还要注意像getFiled()/getDeclaredField()这样的反射方法之间的差异。前者也返回继承的字段,而后者只返回特定类的字段,忽略从其父类继承的字段。

以下代码有效:

    @SuppressWarnings("rawtypes")
    private boolean isRequired(BeanItem item, Object propertyId) throws SecurityException {
        String fieldname = propertyId.toString();
        try {
            java.lang.reflect.Field field = item.getBean().getClass().getDeclaredField(fieldname);
            final JoinColumn joinAnnotation = field.getAnnotation(JoinColumn.class);
            if (null != joinAnnotation) {
                return !joinAnnotation.nullable();
            }
            final Column columnAnnotation = field.getAnnotation(Column.class);
            if (null != columnAnnotation) {
                return !columnAnnotation.nullable();
            }

        } catch (NoSuchFieldException e) {
            //not a problem no need to log this event.
            return false;
        } 
    }

相关内容

  • 没有找到相关文章