idea使用wildfly创建ejb项目

准备工作

到官网下载wildfy,解压缩即可。

创建EJB端模块

  1. 在已有的项目中新建模块(直接新建工程也可以),选择web application
    和ejb(当时我只选择ejb,发现一直报错找不到war包,部署不上去,勾选了web application就可以部署了,还不知道啥原因)

    屏幕快照 2018-01-06 下午5.58.08.png

  2. 在src中新建包,我这里是xyz.wyy.order.service,里面新建接口和实现类。(暂时忽略其他包)

    屏幕快照 2018-01-06 下午6.02.46.png

  3. 接口添加@remote注解,实现类添加@stateless注解
    屏幕快照 2018-01-06 下午6.04.47.png

    屏幕快照 2018-01-06 下午6.04.57.png

  4. 选择edit configrations配置运行,部署到wildfly。在deployment选项卡中,添加生成的war包。
    屏幕快照 2018-01-06 下午6.15.44.png

  5. 如果要链接数据库,还需要添加mysql-connector.jar的依赖。

创建客户端模块

  1. 在已有的项目中新建模块 web application。
  2. 从解压缩的wildfly的 bin/client中拷贝出jboss-client.jar文件,复制到项目lib文件里(在src同级目录中新建lib文件夹),并右击jar包,点击add to classpath
  3. 点击file->Project Structure,在artifacts中,client端的war包新建WEB-INF新建lib文件夹,将ejb的jar包添加进去(刚刚的ejb端已经下载好了,在右侧找ejb,双击就可以),如果jboss-client没有出现在lib里,也将jboss-client添加进去。

    屏幕快照 2018-01-06 下午5.26.19.png

  4. 新建包xyz.wyy.order.service 将接口拷贝过来,注意这里包的名字必须一样才可以。只需要拷贝接口。

  5. 新建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;
        }
    }
  6. 在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密码
  7. 客户端通过EJBFactory获取接口,强制转换为指定接口,调用方法。比如

     HelloWorld hello = (HelloWorld) EJBFactory.getEJB(
                "ejb:/HelloWorldEJB_war_exploded/HelloWorldEJB!edu.nju.session.stateless.HelloWorld"
        );

    jndi路径解析见下面。

  8. 部署运行。

配置数据源(参考这里

  1. 添加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具体是什么版本,需要你看看同级目录其他模块用的版本号。

  2. 添加驱动配置到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> 

  3. 配置数据源

    编辑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路径了。

屏幕快照 2018-01-05 下午8.24.48.png

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

屏幕快照 2018-01-06 下午5.26.19.png

这里有的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的输出中找到了这个

屏幕快照 2018-01-06 下午5.31.52.png

显然是数据源没有配置好,找不到mysql驱动。去检查一下驱动的配置,f********k,把mysql写成了myql,路径不对。。吐血。

所以配置数据源的时候一定要谨慎,遇到问题,一定不要忘记看完整的log输出

猜你喜欢

转载自blog.csdn.net/c_j33/article/details/78990742