intellij配置EJB项目入门

使用的环境
-jdk1.8
-wildfly10

在intellij上配置一个入门级的EJB项目竟然浪费了一天时间,感觉自己碰到了所有网上提到的容易出现的问题(还是笨啊喂 –>_–>),感觉要记录下来,也防止自己以后再犯


intellij新建ejb项目的流程

1 创建一个总的容器project

新建一个java项目(就是简单的java项目别多想。。。),命名为ejb

2 创建服务器端module

右击ejb项目->new->module->勾选javaWeb和EJB->命名为HelloWorldEJB->一路next到finish

在src中新建package,命名为edu.nju.session.stateless,在包下新建一个接口,命名为HelloWorld,代码为

package edu.nju.session.stateless;import javax.ejb.Remote;@Remote
public interface HelloWorld {public String SayHello(String name);
}

除此之外,右击该包,选择new->stateless Session bean->命名为HelloWorld
代码如下

package edu.nju.session.stateless;import javax.ejb.Stateless;@Stateless(name = "HelloWorldEJB")
public class HelloWorldBean implements HelloWorld{public HelloWorldBean() {}@Overridepublic String SayHello(String name){return name+", Hello World.  Welcome to EJB3!";}
}

部署服务器,选择图中

蓝线圈起来的下拉框,选择edit Configuration

点击左上角的+,选择jboss->local->新建之后命名为local->选择右边的Deployment选项卡->选择右侧+->选择war exploded(注意这里一定要是web Deployment)->一路next即可

运行配置好的server,运行完毕后在浏览器输入localhost:8080显示界面如下

最终服务器端的目录为

至此,服务器端就配置好了,接下来对客户端进行配置

3 客户端module

在ejb项目里新建midule,选择ejb项目(网上说选择java项目即可,但是在我的intellij里,如果选择java项目的话就没有ejb支持了),命名为HelloWorldClient

新建lib文件夹,将server端的javax.ejb-api.jar复制到lib文件夹下,然后从JBoss安装路径中,bin\client目录中复制jboss-client.jar。

新建package:edu.nju.session
在该package下新建三个包,分别为client, factory, stateless(注意,这个包名必须为stateless,要和服务器端的接口所在包名相同)
stateless中,将服务器端的HelloWorld接口复制过来,factory中新建类EJBFactory,代码如下

package edu.nju.session.factory;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.rmi.Naming;
import java.util.Hashtable;
import java.util.Properties;public class EJBFactory {public static Object getEJB(String jndipath){try{Properties jndiProps = new Properties();jndiProps.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");jndiProps.put("jboss.naming.client.ejb.context", true);final Context context = new InitialContext(jndiProps);return context.lookup(jndipath);}catch (NamingException e){e.printStackTrace();}return null;}
}

client包中新建类HelloWorldClient,代码如下

package edu.nju.session.client;import edu.nju.session.factory.EJBFactory;
import edu.nju.session.stateless.HelloWorld;/*** Created by 张文玘 on 2017/1/22.*/
public class HelloWorldClient {public static void main(String[] args) {HelloWorld hello = (HelloWorld) EJBFactory.getEJB("ejb:/HelloWorldEJB_war_exploded/HelloWorldEJB!edu.nju.session.stateless.HelloWorld");if(hello!=null){System.out.println("Obtained a remote stateless session bean helloBean for invocation");}System.out.println(hello.SayHello("Mary2"));}
}

在src文件夹下新建jboss-ejb-client.properties文件,配置如下

endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.two.host=localhost
remote.connection.two.port=8080
remote.connection.two.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.username=jboss用户名
remote.connection.default.password=jboss密码

右击HelloWorldClient,选择run就可以运行了,没有意外的话输出应该为

客户端目录为

过程中遇到的问题

说起来好像很简单的样子,可自己这马大哈啥时候能改
容易碰到的错误:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
在网上搜的时候很多都说的是我的jndiProps设置的属性不够明确,但是按照网上的去改的时候又没有用,发现网上说的都是jboss以前的版本,现在的新版本不需要那么麻烦,只需要设
jndiProps.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");即可
那么为什么会报这个错呢?
还是因为对intellij不够了解,老师的教程(eclipse版本)里说的是要把jboss安装目录下/bin/client下的jboss-client.jar导入到库,自己以为是直接复制进lib文件夹就可以了,但是这是错的,要从file下点击project structure,选择module,选择右侧的Dependencies选项卡,点击右侧的+选择jar并选择目录下的jboss-client.jar,在弹出的对话框里选择HelloWorldClient项目(即将这个jar文件配置到客户端)

Java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:CustomView, moduleName:SecurityDelegateEJB, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@12e5a8e
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798)
一定要注意jboss-ejb-client.properties文件的位置
一定要注意jboss-ejb-client.properties文件的位置
一定要注意jboss-ejb-client.properties文件的位置
重要的事情说三遍也不嫌多,一定要放到src文件下,傻得放到客户端根目录下也是蠢得不行。。。

如果你确认自己的jboss-ejb-client.properties文件的位置确实是在src文件下,却还是报上面的那个问题的话,要注意你的jndi名称怎么起

就是上文中说的EJBFactory.getEJB后面的字符串,由于还是j2ee菜鸟,不是很懂这个到底是要干什么,但是每个字段大概的意思是知道的
首先一定要用ejb:/开头,后面的是服务器端的输出目录/对应接口的实现类(即刚才的HelloWorldBean,这里由于定义了name属性所以使用定义的名字)/Remote接口的路径
这个估计是提供一个对接窗口的意思吧。。。
那么错在哪里呢?
错就在服务器端的输出目录,老师的教程里写的是HelloWorldEJB,这里不应该是服务器端的module名,而应该是服务器端的输出目录,可以在整个项目的out文件夹中找到,如图

终于解决了所有问题!不过还有很多不懂的地方,需要继续学习,加油!

更多错误情况参考
http://blog.csdn.net/taiyangdao/article/details/50820318
intellij创建ejb项目传送门(我的还是不够详细)
http://www.cnblogs.com/yangyquin/p/5328344.html

2017.1.23更新
今天写一个stateful的bean的例子的时候又爆了错。。。
错误为:

javax.naming.NamingException: Failed to create proxy [Root exception is java.lang.IllegalStateException: EJBCLIENT000024: No EJB receiver available for handling [appName:, moduleName:MyAccountEJB, distinctName:] combination]at org.jboss.ejb.client.naming.ejb.EjbNamingContext.createEjbProxy(EjbNamingContext.java:206)at org.jboss.ejb.client.naming.ejb.EjbNamingContext.lookup(EjbNamingContext.java:187)at javax.naming.InitialContext.lookup(InitialContext.java:417)at edu.nju.session.stateful.EJBFactory.getEJB(EJBFactory.java:21)at edu.nju.session.stateful.MyAccountClient.main(MyAccountClient.java:14)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.IllegalStateException: EJBCLIENT000024: No EJB receiver available for handling [appName:, moduleName:MyAccountEJB, distinctName:] combinationat org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:873)at org.jboss.ejb.client.EJBClient.createSessionWithPossibleRetries(EJBClient.java:222)at org.jboss.ejb.client.EJBClient.createSession(EJBClient.java:202)at org.jboss.ejb.client.naming.ejb.EjbNamingContext.doCreateProxy(EjbNamingContext.java:227)at org.jboss.ejb.client.naming.ejb.EjbNamingContext.createEjbProxy(EjbNamingContext.java:204)... 9 more
Exception in thread "main" java.lang.NullPointerExceptionat edu.nju.session.stateful.MyAccountClient.main(MyAccountClient.java:17)

这个错还是和jndi的查找名称有关系,要特别注意传给EJBFactory的jndipath是否正确,intellij创建statefull bean的时候自动为它加了name的属性,所以bean-name不能用原来类的名称,要用name里定义的名称(汗。。。同一个地方跌倒两次,以后一定要仔细仔细再仔细!

intellij配置EJB项目入门相关推荐

  1. Intellij Idea 创建Web项目入门(一)

    原文:Intellij Idea 创建Web项目入门(一) 相关软件: Intellij Idea14:http://pan.baidu.com/s/1nu16VyD JDK7:http://pan. ...

  2. 使用IntelliJ IDEA 配置Maven(入门)

    使用IntelliJ IDEA 配置Maven(入门) 下载Maven 官方地址:http://maven.apache.org/download.cgi 下载 解压并新建一个本地仓库文件夹 解压新建 ...

  3. Android Studio新手–下载安装配置–零基础入门–基本使用–调试技能–构建项目基础–使用AS应对常规应用开发

    转自:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–>零基础入门–& ...

  4. IntelliJ IDEA WEB项目的部署配置

    1.前言 虽说Intellij IDEA已经用了四个多月,里面大部分功能还是比较熟悉的,但是很多细节地方还是搞不清楚,这几天公司另一个小组也换成了Intellij IDEA,帮他们迁移项目的时候,因为 ...

  5. IntelliJ IDEA -- SVN配置及项目迁入/检出SVN

    一.下载并安装SVN 本人 IntelliJ IDEA 2018, 小乌龟TortoiseSVN x64 二.配置 如果已经搭建好了svn服务的话,就要开始在idea中配置相关的配置了. 1.配置已安 ...

  6. spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃

    spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃 一.springboot devtool ...

  7. 新版IntelliJ IDEA Web项目配置完整流程

    一.问题描述 新版的IDEA版本中创建Web项目的时候没有了Java Enterprise选项,查看一下相关插件没有问题,默认Java EE相关的插件都以安装并启用,后面启动项目的时候又发现Servl ...

  8. Vue入门(安装配置启动项目)

    学习本篇之前要具备一定的vue基础知识,可以先看一下Vue基础(环境配置.内部指令.全局API.选项.内置组件) 1.Vue-cli Vue-cli是vue官方出品的快速构建单页应用的脚手架,这里牵扯 ...

  9. IDEA环境配置及Spring入门

    IDEA环境配置及Spring入门–以HelloWorld为例的简单介绍与开发步骤 前言:本文主要内容 一:IDEA环境配置 二:用传统Java编程方式写HelloWorld例子 传统java:不使用 ...

最新文章

  1. 为什么阿里巴巴不建议在for循环中使用+进行字符串拼接
  2. 5分钟让你懂得什么是容器技术?
  3. 把ct图像像素值转化为_数字图像概论与基础
  4. 微软代码签名证书使用指南
  5. Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
  6. Android自定义进度条
  7. 一个判断字符串是否是数字的正则表达式
  8. 经典谷歌面试题-扔鸡蛋问题
  9. 80486微型计算机的字长,80486,80586等是什么样的电脑?
  10. [转]asp.net导出数据到Excel的三种方法
  11. 老王讲设计模式(一)——策略模式
  12. 辽源市强化“智慧城市”建设 提高居民幸福指数
  13. 对于新安装的MySQL如何提升MySQL的安全级别
  14. css3盒子模型微课_CSS3 盒子模型
  15. PDF文件中失效链接修改
  16. Google Play镜像站
  17. Android实现淘宝体验的商品列表排序分类点击事件
  18. 用java把word转pdf
  19. SpringMvc下载文件损坏
  20. Virtuoso Layout 系列教程:01 软件安装教程 - 附资源包

热门文章

  1. 学python还是学产品经理_转型AI产品经理,原来不需要学那么深的算法和数学模型...
  2. 未来野心家 苹果研发资金再投140亿美金 四年前的两倍 | 解读
  3. 小白如何入门Python?记我的Python初体验
  4. (二)音视频:MediaCodec编码桌面信息 完整Demo 进一步理解H264
  5. Windows任务栏的搜索框的图片怎么去除
  6. 国密算法-SM4加解密工具类
  7. 高通msm-V4L2-Camera驱动浅析2-框架详解
  8. c语言中阶乘相加怎么表示_用C语言怎样求阶乘之和?
  9. 插入排序(insertionSort)
  10. PostgreSQL进程