从正常访问 EJB class
Access EJB from normal class
我正在使用 Facade 模式通过数据库实体进行访问。我已经编写了一个包装器来访问 Facade EJB,如下所示。正如我从异常中了解到的那样,EJB 似乎尚未初始化。阅读论坛上的异常后,我明白应该解决 @PostConstruct 表示法,但仍然没有帮助。可能是我用错了,任何指点将不胜感激
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);
}
}
但是我在如下调用它时遇到异常
PatientSearchHelper searchHelper = new PatientSearchHelper(patient);
searchHelper.initialize();
return searchHelper.getById();
异常
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 class 成为一个 EJB,并在您的客户端代码中使用 @EJB 在访问任何方法之前获取实例。
您可以使用 @Named
注释来使用 CDI bean,而不是创建一个新的无状态 EJB 来包装另一个 EJB(如果您的方法不需要事务支持)。
@Named
public class PatientSearchHelper {
@EJB
private PatientFacade patientFacade;
private final Patient patient;
private ResponseHeader respHeader;
private SearchResponse searchResponse;
private List<Patient> resultSet;
...
另一种方法是使用以下通用代码在 Beanmanger 中查找一个 bean,如果找到,它只是 returns 所需 class 的实例:
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);
}
通过这种方式,您始终可以获得 EJB-class 的现有实例。这在例如 @FacesConverter
或任何其他无法声明为 @Stateless
.
的 class 中派上用场
我正在使用 Facade 模式通过数据库实体进行访问。我已经编写了一个包装器来访问 Facade EJB,如下所示。正如我从异常中了解到的那样,EJB 似乎尚未初始化。阅读论坛上的异常后,我明白应该解决 @PostConstruct 表示法,但仍然没有帮助。可能是我用错了,任何指点将不胜感激
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);
}
}
但是我在如下调用它时遇到异常
PatientSearchHelper searchHelper = new PatientSearchHelper(patient);
searchHelper.initialize();
return searchHelper.getById();
异常
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 class 成为一个 EJB,并在您的客户端代码中使用 @EJB 在访问任何方法之前获取实例。
您可以使用 @Named
注释来使用 CDI bean,而不是创建一个新的无状态 EJB 来包装另一个 EJB(如果您的方法不需要事务支持)。
@Named
public class PatientSearchHelper {
@EJB
private PatientFacade patientFacade;
private final Patient patient;
private ResponseHeader respHeader;
private SearchResponse searchResponse;
private List<Patient> resultSet;
...
另一种方法是使用以下通用代码在 Beanmanger 中查找一个 bean,如果找到,它只是 returns 所需 class 的实例:
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);
}
通过这种方式,您始终可以获得 EJB-class 的现有实例。这在例如 @FacesConverter
或任何其他无法声明为 @Stateless
.