我必须遵循以下代码来检查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 clean
和mvn install
,但这没有帮助。
Q1:我做错了什么?
Q2:有没有一种更干净的方法来编码isRequired
(也许可以更好地利用泛型)?
property
表示一个类(它是一个Class<?>
)- 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;
}
}