准备工作
到官网下载wildfy,解压缩即可。
创建EJB端模块
在已有的项目中新建模块(直接新建工程也可以),选择web application
和ejb(当时我只选择ejb,发现一直报错找不到war包,部署不上去,勾选了web application就可以部署了,还不知道啥原因)在src中新建包,我这里是xyz.wyy.order.service,里面新建接口和实现类。(暂时忽略其他包)
接口添加
@remote
注解,实现类添加@stateless
注解
选择
edit configrations
配置运行,部署到wildfly。在deployment
选项卡中,添加生成的war包。
如果要链接数据库,还需要添加mysql-connector.jar的依赖。
创建客户端模块
- 在已有的项目中新建模块 web application。
- 从解压缩的wildfly的
bin/client
中拷贝出jboss-client.jar
文件,复制到项目lib文件里(在src同级目录中新建lib文件夹),并右击jar包,点击add to classpath
。 点击
file
->Project Structure
,在artifacts中,client端的war包新建WEB-INF新建lib文件夹,将ejb的jar包添加进去(刚刚的ejb端已经下载好了,在右侧找ejb,双击就可以),如果jboss-client没有出现在lib里,也将jboss-client添加进去。扫描二维码关注公众号,回复: 155091 查看本文章新建包xyz.wyy.order.service 将接口拷贝过来,注意这里包的名字必须一样才可以。只需要拷贝接口。
新建xyz.wyy.order.factory包,新建
EJBFactory.java
public class EJBFactory { private static Object getEJB(String path){ 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(path); }catch (NamingException e){ e.printStackTrace(); } return null; } }
在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=你的wildfly用户名 remote.connection.default.password=你的wildfly密码
客户端通过EJBFactory获取接口,强制转换为指定接口,调用方法。比如
HelloWorld hello = (HelloWorld) EJBFactory.getEJB( "ejb:/HelloWorldEJB_war_exploded/HelloWorldEJB!edu.nju.session.stateless.HelloWorld" );
jndi路径解析见下面。
部署运行。
配置数据源(参考这里)
添加Mysql数据库驱动模块到wildfly
在wildfly/modules/system/layer/base/com目录下创建mysql/main目录,将Mysql驱动jar(例如mysql-connector-java-5.1.6.jar)拷贝到此目录下,并同在此目录下创建module.xml文件,添加内容如下:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-5.1.6.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
注意这里的
rn:jboss:module:1.1
具体是什么版本,需要你看看同级目录其他模块用的版本号。添加驱动配置到wildfly服务器配置文件
编辑wildfly/standalone/configuration/standalone.xml文件,在
<driver name="mysql" module="com.mysql"> <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class> </driver>
配置数据源
编辑wildfly/standalone/configuration/standalone.xml文件,在
<datasource jndi-name="java:/mysqlDS" pool-name="mysqlDSPool"> <connection-url>jdbc:mysql://localhost:3306/jbossdb</connection-url> <driver>mysql</driver> <security> <user-name>admin</user-name> <password>admin</password> </security> </datasource>
至此,JBoss 7/WildFly中配置使用Mysql数据库完成。
项目中使用的代码如下:
try {
Context c = new InitialContext(); //初始化数据源
dataSource = (DataSource) c.lookup("java:/mysqlDS");
} catch (NamingException e) {
e.printStackTrace();
}
遇到的问题
1. artifact ‘XXXX:war exploded’ has invalid extension
一开始新建工程只选择了ejb工程,运行的时候报了这个错。在stackoverflow上的解决方案试了一下,并不能解决问题。索性重新新建了一个module,勾选了ejb和web application,就运行正常了,也不知道什么原因。
2. 找不到ejb对象。
一般这种问题都是jndi路径的问题,我的路径为ejb:/version3EJB_war_exploded/HelloWorldEJB!xyz.wyy.order.service.HelloWorld
。需要解释一下,ejb:/
是ejb固定的命名空间,version3EJB_war_exploded
是ejb项目的名字,这个名字是编译部署上wildfly的名字,需要查看out文件夹查看才算准确,默认不一定是就是你取的项目名字,HelloWorldEJB
是你注解name的ejb名字,不是bean的类名,xyz.wyy.order.service.HelloWorld
是实现类的完整路径。
当然其实在成功部署到wildfly之后,就会看输出信息,直接copy就可以了,也省的你麻烦,比如我的,部署后,有这么一段输出,第一个稍微变一变就是jndi路径了。
3. 错误 Name [ejb:..] is not bound in this Context. Unable to find [ejb:] with root cause javax.naming.NameNotFoundException in Wildfly
出现这个错误的时候,首先要检查你的路径是否写正确,参照第二个问题。其次,看看jboss-client.jar
是否真的加入到了项目的依赖。 在idea中,简单将jar包复制到你新建的lib目录是不行的,点击file
->Project Structure
这里有的lib才是真正已经添加到项目中,能够使用,否则运行的时候会找不到jar。添加的方法是从右侧Available Element
中双击指定的jar包,添加到war输出到war中。(如果右侧没有你的jar包,在你复制过来的jar包上右击,选择add to classpath
)
4. 配置wildfly数据源的时候,每次配置完,重新部署wildfly,之前在standalone.xml
中添加的配置被重置到初始状态。
经历了无数尝试。。发现必须先把wildfly关闭再去配置,否咋配置完再重启,数据都会被重置为上次运行的状态。。
5. 客户端运行的时候,EJB端调用数据库的方法处报错。javax.naming.NameNotFoundException 找不到数据源。
!!要检查配置数据源的步骤有没有按着做!!每一步都不能少!!
我出现这个问题,找了半天bug,最后在wildfly的输出中找到了这个
显然是数据源没有配置好,找不到mysql驱动。去检查一下驱动的配置,f********k,把mysql写成了myql,路径不对。。吐血。
所以配置数据源的时候一定要谨慎,遇到问题,一定不要忘记看完整的log输出