gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:11 24 4
gpt4 key购买 nike

我必须按照代码检查我的 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 注释的人,这里是 header :

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

我希望 isRequired 时不时地返回 true,但它永远不会返回。我已经对我的项目执行了 mvn cleanmvn install,但这没有帮助。

Q1:我做错了什么?

问题 2:是否有一种更简洁的方式来编写 isRequired 代码(或许可以更好地利用泛型)?

最佳答案

  1. property代表一个类(它是一个 Class<?> )
  2. @Column@JoinColumn只能注释字段/方法。

因此,您永远不会在 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() .前者也返回继承的字段,而后者仅返回特定类的字段,忽略从其父级继承的内容。

关于java - 注释反射(使用 getAnnotation)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14965092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com