Glassfish不同WEB项目调用ejb对象

来源:互联网 发布:大麦网抢票软件个人版 编辑:程序博客网 时间:2024/03/29 03:03
参考:
http://www.blogjava.net/terryxue/archive/2010/03/06/314695.html
http://blog.csdn.net/zjx86320/article/details/47145769


1.Glassfish不同WEB项目调用ejb对象


本文使用NetBeans创建了3个项目demo,dtdmp-interface、webtest1、webtest2。其中,dtdmp-interface用于生成公共JAR;webtest1创建TestService类,实现了dtdmp-interface定义的接口;webtest2跨项目调用webtest1的TestService类的EJB对象。


1.1.JAR类库项目dtdmp-interface


1.1.1.新建JAR类库项目dtdmp-interface


1、右键:新建项目,打开向导
2、类别选择"Maven",项目选择"Java应用程序",点击"下一步"
3、项目名称:dtdmp-interface;组件ID:com.gsm;版本:1.0;包:com.gsm.dtdmp.service;点击"完成"。
注意:可通过在项目上右键属性,修改版本号。

1.1.2.项目dtdmp-interface添加接口定义


1、新建包com.gsm.dtdmp.service.bean,在包下创建类文件ServiceTestVO
package com.gsm.dtdmp.service.bean;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class ServiceTestVO implements Serializable {
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

2、在包com.gsm.dtdmp.service,创建接口类ITestService
package com.gsm.dtdmp.service;
import com.gsm.dtdmp.service.bean.ServiceTestVO;
public interface ITestService {
    ServiceTestVO getServiceTestVO(String id);
}


1.1.3.生成JAR


1、清理并构建项目
2、可以从日志看到生成了dtdmp-interface\target\dtdmp-interface-1.0.jar
3、JAR引用方式
<dependency>
   <groupId>com.gsm</groupId>
   <artifactId>dtdmp-interface</artifactId>
   <version>1.0</version>
</dependency>


1.2.WEB项目webtest1


1.2.1.新建WEB项目webtest1


1、右键:新建项目,打开向导
2、类别选择"Maven",项目选择"Web应用程序",点击"下一步"
3、项目名称:webtest1;组件ID:com.gsm;版本:1.0;包:com.gsm.webtest1;点击"下一步"
4、服务器选择:Glassfish Server 4.1;Java EE版本选择:Java EE 7 Web;点击"完成"

1.2.2.添加实现类


1、在pom.xml的dependencies节点下面添加dtdmp-interface-1.0.jar的引用方式,如:
<dependency>
   <groupId>com.gsm</groupId>
   <artifactId>dtdmp-interface</artifactId>
   <version>1.0</version>
</dependency>
2、可以在项目的依赖关系看到已经引入了dtdmp-interface。如果,没有引入,则在依赖关系找到dtdmp-interface,右键"手动安装工件",选择dtdmp-interface-1.0.jar进行安装
3、在包com.gsm.webtest2新建类TestService
package com.gsm.webtest1;
import com.chuangdata.dtdmp.service.bean.ServiceTestVO;
import com.chuangdata.dtdmp.service.i.ITestService;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Remote({ITestService.class})
@Stateless
public class TestService implements ITestService {
    @Override
    public ServiceTestVO getServiceTestVO(String id) {
        ServiceTestVO vo = new ServiceTestVO();
        vo.setId("1001");
        vo.setName("C0001");
        return vo;
    }
}
注意:一定要加@Remote({ITestService.class}),否则,将lookup获取的ejb对象转换为ITestService时,如果是glassfish的相同domain但不同项目间调用,将报错,如:
java.lang.ClassCastException: com.sun.proxy.$Proxy367 cannot be cast to com.chuangdata.dtdmp.service.i.ITestService


1.3.WEB项目webtest2


1.3.1.新建WEB项目webtest2


1、右键:新建项目,打开向导
2、类别选择"Maven",项目选择"Web应用程序",点击"下一步"
3、项目名称:webtest2;组件ID:com.gsm;版本:1.0;包:com.gsm.webtest2;点击"下一步"
4、服务器选择:Glassfish Server 4.1;Java EE版本选择:Java EE 7 Web;点击"完成"

1.3.2.添加实现类


1、在pom.xml的dependencies节点下面添加dtdmp-interface-1.0.jar的引用方式,如:
<dependency>
   <groupId>com.gsm</groupId>
   <artifactId>dtdmp-interface</artifactId>
   <version>1.0</version>
</dependency>
2、可以在项目的依赖关系看到已经引入了dtdmp-interface。如果,没有引入,则在依赖关系找到dtdmp-interface,右键"手动安装工件",选择dtdmp-interface-1.0.jar进行安装
3、新建包com.gsm.webtest2.entity,创建实体类TestVO
package com.gsm.webtest2.entity;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class TestVO implements Serializable {
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
4、新建包com.gsm.webtest2.commons,创建类ApplicationConfig
5、新建包com.gsm.webtest2.control,创建类TestService
package com.gsm.webtest2.control;
import com.gsm.dtdmp.service.ITestService;
import com.gsm.dtdmp.service.bean.ServiceTestVO;
import com.gsm.webtest2.entity.TestVO;
import javax.ejb.Stateless;
import javax.naming.InitialContext;
@Stateless
public class TestService {
    private ITestService service;
    private ITestService getService() {
        if (null == service) {
            try {
                InitialContext ctx = new InitialContext();
                String applicationName = "webtest1";
                String jndiName = "java:global/" + applicationName + "/TestService";
                Object obj = ctx.lookup(jndiName);
                service = (ITestService) obj;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return service;
    }
    public TestVO getTestVO() {
        if (null != getService()) {
            ServiceTestVO data = getService().getServiceTestVO("");
            if (data != null) {
                TestVO testVO = new TestVO();
                testVO.setId(data.getId());
                testVO.setName(data.getName());
                return testVO;
            }
        }
        return null;
    }
}
6、新建包com.gsm.webtest2.boundary,创建类TestREST
package com.gsm.webtest2.boundary;
import com.gsm.webtest2.control.TestService;
import com.gsm.webtest2.entity.TestVO;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Stateless
@Path("test")
public class TestREST {
    @EJB
    private TestService service;
    @GET
    @Path("gettestvo")
    @Produces(MediaType.APPLICATION_JSON)
    public TestVO getTestVO() {
        return service.getTestVO();
    }
}
7、新建包com.gsm.webtest2.commons,创建类ApplicationConfig
package com.gsm.webtest2.commons;
import javax.ws.rs.core.Application;
@javax.ws.rs.ApplicationPath("api")
public class ApplicationConfig extends Application {
}


1.4.运行项目,检查效果


1、项目webtest1,清理并构建
2、项目webtest2,清理并构建
3、运行项目webtest1
4、运行项目webtest2
5、浏览器输入:http://localhost:8080/webtest2/api/test/gettestvo,正常的话会输出数据:{"id":"1001","name":"C0001"}
原创粉丝点击