2016-04-11 9 views
3

Ich benutze Facade-Muster für den Zugriff von Datenbank-Entities. Ich habe einen Wrapper geschrieben, um auf das Facade EJB wie unten zuzugreifen. Wie ich aus der Ausnahme verstehe, scheint es, als ob die EJB nicht initialisiert wurde. Nach dem Lesen über die Ausnahme in Foren, habe ich verstanden, dass es gelöst werden sollte @ PostConstruct Notation, aber immer noch keine Hilfe. Kann ich es falsch verwenden, werden alle Hinweise sehrZugriff EJB von normaler Klasse

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

geschätzt werden jedoch ich die Ausnahme erhalten, wenn es wie unten

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

Exception

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) 

Antwort

2

Wenn Sie möchten telefonieren zu Container zum Erstellen von EJB-Instanzen müssen Sie mithilfe von JNDI- oder @EJB-Annotation zugreifen. Um den obigen Code zu verwenden, machen Sie die PatientSearchHelper-Klasse zu einem EJB und verwenden Sie @EJB in Ihrem Client-Code, um die Instanz vor dem Zugriff auf Methoden zu erhalten.

+0

Danke IndoKnight !! PatientSearchHelper statuslos machen löste mein Problem. –

0

Anstatt einen neuen zustandslosen EJB zu erstellen, um einen anderen zu umbrechen (und wenn Ihre Methoden keine transaktionale Unterstützung erfordern), können Sie CDI-Beans mit @Named Annotation verwenden.

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

Auf diese Weise können Sie immer eine bestehende erhalten: wenn gefunden

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

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

Ein anderer Ansatz wäre mit folgenden allgemeinen Code in der Beanmanger eine Bohne zum Nachschlagen sein, die einfach eine Instanz Ihrer gewünschten Klasse zurückgibt Instanz Ihrer EJB-Klasse. Dies ist zum Beispiel nützlich in einer @FacesConverter oder einer anderen Klasse, die nicht @Stateless deklariert werden kann.