当前位置: 首页 > 知识库问答 >
问题:

如何在另一个客户端项目中调用@远程EJB

咸亦
2023-03-14

我需要能够从这个简单的摇摆java应用程序调用保存()方法到我的Web应用程序,该应用程序在服务器上发布,其中包含我用来保存新实体类型类角色的bean,该类具有名称、地址、电子邮件。

我在使用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 Bean:

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:

@EJB(lookup = "java:global/proyectobase/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("");
                }

            }
        });

我也试着用这个:

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

ContactoDAO contactoDAO;

我在我的ContactoDAO上一直收到空指针异常,但这可能是因为查找没有找到任何东西或者我没有正确使用它,我真的不知道。我的问题是在另一个简单的摇摆项目中从我的bean调用我的保存方法的另一种方式是什么,或者当我使用@EJB时,我可能会丢失其他东西?

编辑:这是我的豆子。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>

共有1个答案

邓焱
2023-03-14

从日志中可以看出,在服务器上初始化ContactDAO及其所有依赖项都是正确的。在独立swing客户端上,可能缺少jboss ejb客户端。属性,也可以显式设置初始上下文属性并手动执行JNDI查找。

SE岗位

您还应该确保包含jboss客户端。swing客户端项目的类路径中的jar文件。

Wildfly开发者指南

如果出现身份验证失败异常,则需要将用户名/密码属性添加到InitialContext并运行add user。服务器上的sh脚本

添加用户

 类似资料:
  • 通过 Invoke 方法同步调用 Invoke(string, []reflect.Value, *InvokeSettings) ([]reflect.Value, error) Invoke 方法有三个输入参数,两个输出参数。 第一个输入参数是远程方法名。 第二个输入参数是远程方法参数。 第三个输入参数是远程调用设置。 第一个输出参数表示返回的结果。 第二个输出参数表示返回的错误。 因为使用该

  • 我有两个项目,一个是由reactjs开发的,另一个是由laravel开发的。我想从laravel项目中获取一些数据,因此,我通过api调用访问laravel项目控制器文件夹中的一个方法。如果我使用reactjs项目中的方法,如何调试laravel项目?

  • 我正在构建一个定制的Java库。我把我的大部分“重复”代码都保存在那里,比如文件处理、字符串处理等。每次我想使用它们时,我都必须将该类复制并粘贴到我正在进行的其他项目中。有没有办法让这个自定义库类成为“依赖项”?我在用我的智能手机。

  • 我有一个(基于Maven的)项目a加载在Intellij中,它有许多依赖项。 我想在B中放置断点并调试项目A,以便在项目B中达到断点时A停止。 在Eclipse中,我只需要将两个项目放在同一个工作区中,它就可以工作了。由于Intellij中没有工作区,我想知道该如何做,以及是否可能。

  • 我正在尝试从瘦客户端对WebSphere Liberty20.0.0.10(JDK 8)进行远程EJB 3调用。客户端不在EJB容器中运行。我谷歌了这个页面,并尝试按照说明进行操作:https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/twlp_ejb_remote.

  • 我试图使用JBoss7.1.1中的JNDI从远程客户端调用,但我得到了一个异常: 我使用的是jboss的安全机制,并且我已经通过add-user.bat添加了用户,还有带有用户名和密码的jboss-ejb-client.properties文件,但仍然会得到异常。我遵循了链接的示例集:使用JNDI从远程客户端进行EJB调用,当我不使用安全机制时也是如此,但是当我使用安全机制时,就会出现错误 你错过