2016-04-11 25 views
3

Veritabanı öğeleri tarafından erişmek için Facade desen kullanıyorum. Aşağıdaki gibi Cephe EJB'ye erişmek için bir ambalaj yazdım. İstisnadan anladığım gibi, EJB'nin ilklendirilmediği görülüyor. Forumlarda istisna hakkında okuduktan sonra, bunun @PostConstruct notasyonu ile çözülmesi gerektiğini ama hala yardım olmadığını anladım. Yanlış kullanıyor olabilir, herhangi bir işaretçiler büyük ölçüde olmak için Erişim EJB normal sınıftan

PatientSearchHelper searchHelper = new PatientSearchHelper(patient); 
searchHelper.initialize(); 
return searchHelper.getById(); 

altına İstisna

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) 

cevap

2

gibi çağrılırken özel durum almak Ancak

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); 
    } 
} 

takdir olacak EJB örnekleri oluşturmak için konteyner, JNDI veya @EJB ek açıklama kullanarak kullanarak erişmeniz gerekir. Yukarıdaki kodun çalışması için PatientSearchHelper sınıfını bir EJB yapın ve herhangi bir yönteme erişmeden önce örneği almak için istemci kodunuzda @EJB kullanın.

+0

Teşekkürler IndoKnight !! PatientSearchHelper durumunu belirleme sorunu çözdü. –

0

Yeni bir Stateless EJB'yi diğerine sarmak yerine (ve yöntemleriniz İşlem desteği gerektirmiyorsa), CDI çekirdeklerini @Named ek notu kullanarak kullanabilirsiniz. bulursa

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

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

başka bir yaklaşım sadece istenen sınıfının bir örneğini döndürür aşağıdaki genel kodla Beanmanger bir fasulye arama olacaktır:

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); 
} 

her zaman varolan alabilirsiniz Bu şekilde EJB sınıfınızın örneği. Bu, örneğin @FacesConverter ya da @Stateless bildirilemeyen başka bir sınıfta kullanışlı olarak gelir.