You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在外部类中获取IdentificationCluster的@Path注解

问题:无法通过反射获取字段的@Path注解

我尝试在Main类中获取N2Composition类里identification字段的@Path注解,但使用常规的getAnnotation()方法始终无法成功,调用时直接报错。

相关代码

N2Composition类

package org.example.n2composition;

import com.nedap.archie.rm.archetyped.FeederAudit;
import com.nedap.archie.rm.generic.Participation;
import com.nedap.archie.rm.generic.PartyIdentified;
import com.nedap.archie.rm.generic.PartyProxy;
import java.lang.String;
import java.time.temporal.TemporalAccessor;
import java.util.List;
import javax.annotation.processing.Generated;
import org.ehrbase.client.annotations.Archetype;
import org.ehrbase.client.annotations.Entity;
import org.ehrbase.client.annotations.Id;
import org.ehrbase.client.annotations.Path;
import org.ehrbase.client.annotations.Template;
import org.ehrbase.client.classgenerator.interfaces.CompositionEntity;
import org.ehrbase.client.classgenerator.shareddefinition.Category;
import org.ehrbase.client.classgenerator.shareddefinition.Language;
import org.ehrbase.client.classgenerator.shareddefinition.Setting;
import org.ehrbase.client.classgenerator.shareddefinition.Territory;
import org.ehrbase.client.openehrclient.VersionUid;
import org.example.n2composition.definition.CodedTextDefiningCode;
import org.example.n2composition.definition.IdentificationCluster;
import org.example.n2composition.definition.PatientroleCluster;
import org.example.n2composition.definition.ProblemDiagnosisEvaluation;

@Entity
@Archetype("openEHR-EHR-COMPOSITION.information.v0")
@Generated(
    value = "org.ehrbase.client.classgenerator.ClassGenerator",
    date = "2023-03-24T11:50:15.994180+01:00",
    comments = "https://github.com/ehrbase/openEHR_SDK Version: 1.26.0-SNAPSHOT"
)
@Template("2")
public class N2Composition implements CompositionEntity {
  /**
   * Path: 2/Coded text
   */
  @Path("/category[at0001]|defining_code")
  private CodedTextDefiningCode codedTextDefiningCode;

  /**
   * Path: 2/Event Context/CLUSTER/identification
   * Description: identification
   */
  @Path("/context[at0002]/other_context[at0018]/items[at0019]/items[openEHR-EHR-CLUSTER.identification.v0]")
  private IdentificationCluster identification;
}

Main类

package org.example;


import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.nedap.archie.rm.datavalues.DvCodedText;
import org.ehrbase.client.annotations.Template;
import org.example.n2composition.N2Composition;
import org.example.n2composition.definition.IdentificationCluster;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) throws NoSuchFieldException {

        ReadingFile r = new ReadingFile();
        r.resultado();
        String s1 = "C:\\Users\\omarah\\Documents\\ETL\\MAPEOS\\MAPEO1_1.txt";
        String s2 = "C:\\Users\\omarah\\Documents\\ETL\\MAPEOS\\ATRIBUTOSYVALORES-DIAGNÓSTICO2.txt";
        r.reading(s1,s2);

        List<String> list1 = r.getResult1();
        List<String> list2 = r.getResult2();

        N2Composition n2 = new N2Composition();
        IdentificationCluster i = new IdentificationCluster();
        DvCodedText dv = new DvCodedText();
        dv.setValue("hola");
        i.setDvCodedText(dv);

        Field f = N2Composition.class.getDeclaredField("identification");
        String p = f.getAnnotation(Path.class).value();

        n2.setIdentification(i);
    }
}

解决方法

  • 修正导包错误
    你在Main类中错误导入了java.nio.file.Path(这是文件路径类),但N2Composition里使用的@Path注解是org.ehrbase.client.annotations.Path。把Main类中的import java.nio.file.Path;删除,替换为import org.ehrbase.client.annotations.Path;。

  • 验证注解的运行时可见性
    确认org.ehrbase.client.annotations.Path注解的定义中包含@Retention(RetentionPolicy.RUNTIME),只有运行时可见的注解才能通过反射获取。ehrbase的官方注解默认满足这个条件,无需额外修改。

  • 添加空指针防护
    修正导包后,原反射代码可以正常工作,但建议添加空判断避免空指针异常:

    Field f = N2Composition.class.getDeclaredField("identification");
    Path pathAnnotation = f.getAnnotation(Path.class);
    if (pathAnnotation != null) {
        String p = pathAnnotation.value();
        // 执行后续业务逻辑
    } else {
        System.err.println("该字段未标注@Path注解");
    }
    

内容的提问来源于stack exchange,提问作者Omar Abdellah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:17:47