Jakarta ee 从普通类访问EJB

Jakarta ee 从普通类访问EJB,jakarta-ee,ejb,Jakarta Ee,Ejb,我使用Facade模式来访问数据库实体。我编写了一个包装器来访问FacadeEJB,如下所示。正如我从异常中了解到的,EJB似乎还没有初始化。在论坛上阅读了关于异常的内容后,我明白应该在@PostConstruct notation解决这个问题,但仍然没有任何帮助。也许我用错了,任何指点都将不胜感激 public class PatientSearchHelper { @EJB private PatientFacade patientFacade; private f

我使用Facade模式来访问数据库实体。我编写了一个包装器来访问FacadeEJB,如下所示。正如我从异常中了解到的,EJB似乎还没有初始化。在论坛上阅读了关于异常的内容后,我明白应该在@PostConstruct notation解决这个问题,但仍然没有任何帮助。也许我用错了,任何指点都将不胜感激

public class PatientSearchHelper {
    @EJB
    private PatientFacade patientFacade;

    private final Patient patient;
    private ResponseHeader respHeader;
    private SearchResponse searchResponse;
    private List<Patient> resultSet;


    public PatientSearchHelper (Patient patient) {
        this.patient = patient;
    }

    @PostConstruct
    public void initialize() {
        this.respHeader = new ResponseHeader();
        this.searchResponse = new SearchResponse();
    }

    public SearchResponse getById() {

        System.out.println("Patient Id: " + patient.getPatientid());
        //patientFacade = (PatientFacade) new InitialContext().lookup("java:global/Aarogayam2/PatientFacade!common.facades.PatientFacade");
        resultSet = patientFacade.findById(patient.getPatientid());


        if (resultSet.size() > 0) {
           formatFoundResponse();
        } else {
            formatNotFoundResponse();
        }
        return searchResponse;
    }

    private void formatFoundResponse() {
        searchResponse.setPayload(resultSet);
        respHeader.setSuccess(true);
        searchResponse.setHeader(respHeader);
    }

    private void formatNotFoundResponse() {
        respHeader.setSuccess(false);
        respHeader.setMessage("No Patient found");
        searchResponse.setHeader(respHeader);
        searchResponse.setPayload(null);
    }
}
例外情况

SEVERE:   java.lang.NullPointerException
    at common.helpers.PatientSearchHelper.getById(PatientSearchHelper.java:48)
    at common.services.PatientService.getById(PatientService.java:57)
    at common.services.PatientService$Proxy$_$$_WeldSubclass.getById(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)

如果您想创建容器来创建EJB实例,则需要使用JNDI或@EJB注释进行访问。为了使上述代码正常工作,请使PatientSearchHelper类成为EJB,并在访问任何方法之前在客户端代码中使用@EJB来获取实例。

您可以使用CDI bean,使用
@Named
注释,而不是创建新的无状态EJB来包装另一个实例(如果您的方法不需要事务支持)

@Named
public class PatientSearchHelper {
@EJB
private PatientFacade patientFacade;

private final Patient patient;
private ResponseHeader respHeader;
private SearchResponse searchResponse;
private List<Patient> resultSet;
...
@Named
公共类PatientSearchHelper{
@EJB
私人诊所;
私人最终病人;
私人负责人;
私人搜索响应搜索响应;
私有列表结果集;
...

另一种方法是使用以下通用代码在Beanmanger中查找bean,如果找到,只需返回所需类的实例:

private static <T> T lookUpClassInBeanManager(Class<T> clazz) {
    BeanManager bm = CDI.current().getBeanManager();
    Bean<T> bean = (Bean<T>) bm.getBeans(clazz).iterator().next();
    CreationalContext<T> ctx = bm.createCreationalContext(bean);
    return (T) bm.getReference(bean, clazz, ctx);
}

public static PatientFacade lookUpPatientFacade() {
        return lookUpClassInBeanManager(PatientFacade.class);
}
private static T lookUpClassInBeanManager(类clazz){
BeanManager bm=CDI.current().getBeanManager();
Bean=(Bean)bm.getBeans(clazz.iterator().next();
CreationalContext ctx=bm.createCreationalContext(bean);
return(T)bm.getReference(bean、clazz、ctx);
}
公共静态PatientFacade lookUpPatientFacade(){
返回lookUpClassInBeanManager(PatientFacade.class);
}

通过这种方式,您可以始终获得EJB类的现有实例。例如,在
@FacesConverter
或任何其他不能声明为
@Stateless

的类中,这非常方便。感谢IndowKnight!!将PatientSearchHelper设置为无状态解决了我的问题。
private static <T> T lookUpClassInBeanManager(Class<T> clazz) {
    BeanManager bm = CDI.current().getBeanManager();
    Bean<T> bean = (Bean<T>) bm.getBeans(clazz).iterator().next();
    CreationalContext<T> ctx = bm.createCreationalContext(bean);
    return (T) bm.getReference(bean, clazz, ctx);
}

public static PatientFacade lookUpPatientFacade() {
        return lookUpClassInBeanManager(PatientFacade.class);
}