java - 如何从客户端创建远程 session EJB

标签 java jakarta-ee netbeans glassfish ejb

根据 Netbeans Tutorial on EJB Client applications ,我似乎无法调用该方法:

编译错误:

-do-compile:
    [mkdir] Created dir: /home/thufir/NetBeansProjects/EntAppClient/build/empty
    [mkdir] Created dir: /home/thufir/NetBeansProjects/EntAppClient/build/generated-sources/ap-source-output
    [javac] Compiling 1 source file to /home/thufir/NetBeansProjects/EntAppClient/build/jar
    [javac] /home/thufir/NetBeansProjects/EntAppClient/src/java/entappclient/Main.java:16: error: cannot find symbol
    [javac]         System.err.println("result = " + mySession.getResult());
    [javac]                                                   ^
    [javac]   symbol:   method getResult()
    [javac]   location: variable mySession of type MySessionRemote
    [javac] 1 error

BUILD FAILED

客户:

package entappclient;

import ejb.MySessionRemote;
import javax.ejb.EJB;

public class Main {

    @EJB
    private static MySessionRemote mySession;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        System.err.println("result = " + mySession.getResult());

    }

}

ejb:

package ejb;

import javax.ejb.Stateless;

@Stateless
public class MySession implements MySessionRemote {

    public String getResult() {
        return "This is My Session Bean";
    }
}

远程接口(interface):

package ejb;

import javax.ejb.Remote;

@Remote
public interface MySessionRemote {

}

现在,如果修改接口(interface):

package ejb;

import javax.ejb.Remote;

@Remote
public interface MySessionRemote {

    public String getResult();
}

bean 现在可以使用 @Override 方法:

package ejb;

import javax.ejb.Stateless;

@Stateless
public class MySession implements MySessionRemote {

    @Override
    public String getResult() {
        return "This is My Session Bean";
    }
}

但是,有一个 NPE:

-run:
     [java] java.lang.reflect.InvocationTargetException
     [java]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     [java]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     [java]     at java.lang.reflect.Method.invoke(Method.java:606)
     [java]     at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:446)
     [java]     at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:166)
     [java] Caused by: java.lang.NullPointerException
     [java]     at entappclient.Main.main(Main.java:16)
     [java]     ... 6 more
     [java] Java Result: 1

run:

BUILD SUCCESSFUL
Total time: 18 seconds
thufir@dur:~/NetBeansProjects/EntAppClient$ 

如何正确调用该方法? EJB 未实例化?

最佳答案

我从头开始。我能想到的唯一区别是,我没有创建 EJB 应用程序,而是为 bean 创建了一个 EJB 模块。否则我认为是一样的。

结构:

thufir@dur:~/NetBeansProjects$ 
thufir@dur:~/NetBeansProjects$ tree HelloLibrary/
HelloLibrary/
├── build.xml
├── nbproject
│   ├── build-impl.xml
│   ├── genfiles.properties
│   ├── private
│   │   └── private.properties
│   ├── project.properties
│   └── project.xml
└── src
    └── hello
        └── HelloBeanRemote.java

4 directories, 7 files
thufir@dur:~/NetBeansProjects$ 
thufir@dur:~/NetBeansProjects$ tree HelloEJB/
HelloEJB/
├── build.xml
├── nbproject
│   ├── ant-deploy.xml
│   ├── build-impl.xml
│   ├── genfiles.properties
│   ├── private
│   │   └── private.properties
│   ├── project.properties
│   └── project.xml
└── src
    ├── conf
    │   └── MANIFEST.MF
    └── java
        └── hello
            └── HelloBean.java

6 directories, 9 files
thufir@dur:~/NetBeansProjects$ 
thufir@dur:~/NetBeansProjects$ tree HelloClient/
HelloClient/
├── build.xml
├── nbproject
│   ├── ant-deploy.xml
│   ├── build-impl.xml
│   ├── genfiles.properties
│   ├── private
│   │   └── private.properties
│   ├── project.properties
│   └── project.xml
├── src
│   ├── conf
│   │   ├── application-client.xml
│   │   └── MANIFEST.MF
│   └── java
│       └── helloclient
│           └── Main.java
└── test

7 directories, 10 files
thufir@dur:~/NetBeansProjects$ 
thufir@dur:~/NetBeansProjects$ 

客户端代码:

package helloclient;

import hello.HelloBeanRemote;
import javax.ejb.EJB;

public class Main {
    @EJB
    private static HelloBeanRemote helloBean;

    public static void main(String... args) {
        System.out.println(helloBean.Hi());
    }

}

bean :

package hello;

import javax.ejb.Stateless;

@Stateless
public class HelloBean implements HelloBeanRemote {

    @Override
    public String Hi() {
        return "hello world";
    }

    @Override
    public String Bye() {
        return "goodbye";
    }

}

远程接口(interface):

package hello;

import javax.ejb.Remote;

@Remote
public interface HelloBeanRemote {
    public String Hi();
    public String Bye();
}

关于java - 如何从客户端创建远程 session EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828542/

相关文章:

html - 每页都有页眉的打印友好页面?

java - Azure postgresql 服务器 - 如何通过rest api公开

java - Netbeans 无法读取我的第二个表单

java - 在 Java 中验证字符串

java - 动态设置索引。这样所有可能的输入都可以被第一个整除

java - spring-data-jpa: ORA-01795: 列表中表达式的最大数量为 1000

java - 我正在向某人现有的 Swing 代码添加一个组合框。我在这里做错了什么?

java - 使用 jdbc 时尝试连接到远程 pg db 时出现奇怪的错误

java - Java 连接器体系结构 (JCA) 中的网络边界在哪里?

java - Netbeans 中的 JTable : how do display table of many columns