2015-12-12 105 views
1

我需要能夠從這個簡單的swing java應用程序調用save()方法到我用發佈在服務器上的web應用程序來保存新的實體類型類Persona,具有名稱,地址,電子郵件。如何在另一個客戶端項目中調用@Remote EJB

進出口使用wildfly 8.x中對我的服務器,並讓我的web應用程序公佈如下:

23:51:10,641 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-3) JNDI bindings for session bean named ContactoDAO in deployment unit deployment "proyectobase.war" are as follows: 

java:global/proyectobase/ContactoDAO!edu.ups.appdis.proyectobase.negocio.ContactoDAO 
java:app/proyectobase/ContactoDAO!edu.ups.appdis.proyectobase.negocio.ContactoDAO 
java:module/ContactoDAO!edu.ups.appdis.proyectobase.negocio.ContactoDAO 
java:global/proyectobase/ContactoDAO 
java:app/proyectobase/ContactoDAO 
java:module/ContactoDAO 

這是我ContactoDAO豆:

package edu.ups.appdis.proyectobase.negocio; 

import java.io.Serializable; 
import java.util.List; 

import javax.ejb.Remote; 
import javax.ejb.Stateless; 
import javax.inject.Inject; 
import javax.persistence.EntityManager; 
import javax.persistence.Query; 

import edu.ups.appdis.proyectobase.modelo.Persona; 

@Stateless 
// @Remote(Serializable.class) 
@Remote 
public class ContactoDAO implements Serializable { 

    // @Inject 
    // private Logger log; 

    /** 
    * 
    */ 

    @Inject 
    private EntityManager em; 

    public void save(Persona persona) { 
//  if (em.find(Persona.class, persona.getCodiog()) == null) { 
      insertar(persona); 
//  } else { 
// 
//   update(persona); 
//  } 
    } 

    public void test() { 
     System.out.println("si funciona "); 
    } 

    public void insertar(Persona persona) { 
     em.persist(persona); 

    } 

    public void update(Persona persona) { 
     em.merge(persona); 

    } 

    public void remove(int codigo) { 
     Persona persona = em.find(Persona.class, codigo); 
     em.remove(persona); 

    } 

    public Persona read(int codigo) { 
     System.out.println("insertado objeto persona"); 
     return em.find(Persona.class, codigo); 
    } 

    public List<Persona> getContactos() { 
     String sql = "SELECT p FROM Persona p"; 
     Query query = em.createQuery(sql, Persona.class); 
     List<Persona> personas = query.getResultList(); 

     return personas; 
    } 

} 

在我簡單的客戶端Swing應用程序我有它的設置是這樣的:

package cliente.gui; 

import java.awt.EventQueue; 
............ 
import javax.ejb.EJB; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import java.security.Security; 
import java.util.Hashtable; 

import edu.ups.appdis.proyectobase.modelo.Persona; 
import edu.ups.appdis.proyectobase.negocio.*; 

public class guiPersona { 
// @EJB(lookup = "java:global/proyectobase/ContactoDAO!edu.ups.appdis.proyectobase.negocio.ContactoDAO") 
    @EJB(lookup = "java:global/proyectobase/ContactoDAO") 
    ContactoDAO contactoDAO; 
    private JFrame frame; 
    private JTextField textNombre; 
    private JTextField textDireccion; 
    private JTextField textEmail; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        guiPersona window = new guiPersona(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    * 
    * @throws NamingException 
    */ 
    public guiPersona() { 
     initialize(); 
    } 



     ........... 



JButton btnGuardar = new JButton("Guardar"); 
     btnGuardar.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       contactoDAO.test(); 

       if (textDireccion.getText() != "" && textEmail.getText() != "" && textNombre.getText() != "") { 

        Persona p = new Persona(); 

        p.setNombre(textNombre.getText()); 
        p.setDireccion(textDireccion.getText()); 
        p.setEmail(textEmail.getText()); 

        contactoDAO.save(p); 

        textNombre.setText(""); 
        textDireccion.setText(""); 
        textEmail.setText(""); 
       } 

      } 
     }); 

你可以在上面的代碼中看到我用這個來調用我的bean在另一個p royect:

@EJB(lookup = "java:global/proyectobase/ContactoDAO") 
ContactoDAO contactoDAO; 

而且在我的按鈕,保存新條目我用這個:

@EJB(lookup="java:global/proyectobase/ContactoDAO!edu.ups.appdis.proyectobase.negocio.ContactoDAO") 

ContactoDAO contactoDAO; 

我一直得到一個空指針異常:

   if (textDireccion.getText() != "" && textEmail.getText() != "" && textNombre.getText() != "") { 

        Persona p = new Persona(); 

        p.setNombre(textNombre.getText()); 
        p.setDireccion(textDireccion.getText()); 
        p.setEmail(textEmail.getText()); 

        contactoDAO.save(p); 

        textNombre.setText(""); 
        textDireccion.setText(""); 
        textEmail.setText(""); 
       } 

      } 
     }); 

我也是用這個嘗試我的ContactoDAO但是這可能是因爲查找沒有找到任何東西或我沒有正確使用它,我真的不知道。我的問題是在另一個簡單的swing項目中從另一個bean中調用save方法的另一種方式,或者當我使用@EJB時,我可能會丟失其他東西?

編輯: 這是我的beans.xml,以防萬一你想知道。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://xmlns.jcp.org/xml/ns/javaee 
     http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all"> 
</beans> 
+0

你META-INF文件夾中有beans.xml文件? – akki

+0

是的,我不認爲我配置了任何東西,但我會將它添加到上面的問題。 –

回答

1

從日誌看來,您的ContactDAO及其所有依賴關係在服務器上初始化正確。在獨立的swing客戶端上,可能缺少META-INF文件夾中的jboss-ejb-client.properties,或者也可以顯式設置初始上下文屬性並手動執行JNDI查找。你

SE POST

還應該確保包括在揮杆客戶項目的類路徑中的jboss-client.jar的文件。

Wildfly Developer Guide

如果你得到一個驗證失敗的例外,那麼你需要用戶名/密碼屬性服務器上添加向初始和運行add-user.sh腳本

Add User

+0

我沒有在我的swing客戶端上創建的META-INF文件夾,我跟着一個教程,它沒有說任何關於添加這個。我要添加它,看看它是否有效。 –

+0

我沒有得到它我不知道我什麼缺失或如何使用它,我遵循這個教程[鏈接](http://blog.akquinet.de/2014/09/26/jboss-eap-wildfly-three-ways -to-invoke-remote-ejbs /)並使用第二種方法,但我一直在收到這個無法實例化類:org.jboss.naming。remote.client.InitialContextFactory錯誤。 –

+0

您需要將jboss-client.jar添加到您的類路徑中。看看編輯過的答案。 – akki