项目需要通过jndi获得远程ejb对象,在把相应的操作发布成web service供.net调用
直接通过JNDI访问没有问题,web service发布也没问题,可以查看wsdl,但是在web service服务端里使用JNDI获得远程EJB就报错了
难道在web service中不能使用jndi???
提供的service方法为:
public FindCdmaResponse findCdma(FindCdmaRequest request) {
FindCdmaResponse response = new FindCdmaResponse();
try {
OSSInterface oss = JNDIUtil.getOSSInterface();
List list = oss.findCdmaAccNbrByWHRX(request.getDistNbr(), request.getNxxNbr(), request.getLineNbr(), request.getCount(), request.getLocalNetId());
PhoneNumber[] numbers = new PhoneNumber[list.size()];
for (int i = 0; i < list.size(); i++) {
Map m = (Map) list.get(i);
numbers[i] = new PhoneNumber();
numbers[i].setAccNbr((String) m.get("AccNbr"));
numbers[i].setAreaId((String) m.get("AreaId"));
numbers[i].setAccNbrClassId((String) m.get("AccNbrClassId"));
numbers[i].setAccNbrClassName((String) m.get("AccNbrClassName"));
numbers[i].setAgentId((String) m.get("AgentId"));
numbers[i].setWorkAreaId((String) m.get("WorkAreaId"));
numbers[i].setWorkAreaName((String) m.get("WorkAreaName"));
numbers[i].setIsAdvance((String) m.get("IsAdvance"));
}
response.set_return(numbers);
} catch (RemoteException e) {
e.printStackTrace();
} catch (CreateException e) {
e.printStackTrace();
} catch (NoDataException e) {
e.printStackTrace();
} catch (InterfaceException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public class JNDIUtil {
private static final String JNDI_NAME = "OSSInterface";
private static final String PROVIDER_URL = "t3://133.0.176.229:5001";
private static final String SECURITY_PRINCIPAL = "weblogic";
private static final String SECURITY_CREDENTIALS = "weblogic";
public static Context getInitialContext() throws Exception {
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
p.put(Context.PROVIDER_URL, PROVIDER_URL);
p.put(Context.SECURITY_PRINCIPAL, SECURITY_PRINCIPAL);
p.put(Context.SECURITY_CREDENTIALS, SECURITY_CREDENTIALS);
return new InitialContext(p);
}
public static OSSInterface getOSSInterface() throws Exception {
Context cxt = getInitialContext();
Object objRef = cxt.lookup(JNDI_NAME);
OSSInterfaceHome home = (OSSInterfaceHome) PortableRemoteObject.narrow(
objRef, OSSInterfaceHome.class);
return home.create();
}
}
直接通过JNDI访问
public class JNDITest {
/**
* @param args
*/
public static void main(String[] args) {
try {
OSSInterface oss = JNDIUtil.getOSSInterface();
List list = oss.findCdmaAccNbrByWHRX("027", "1330", "%29%",new Integer(10), new Integer(1001));
for (int i = 0; i < list.size(); i++) {
System.out.println(i + ":" + list.get(i));
}
} catch (RemoteException e) {
e.printStackTrace();
} catch (CreateException e) {
e.printStackTrace();
} catch (InterfaceException e) {
e.printStackTrace();
} catch (NoDataException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过客户端调用
public void testfindCdma() throws java.lang.Exception {
String url = "http://localhost:8080/axis2/services/QiangHaoService";
QiangHaoServiceStub stub = new QiangHaoServiceStub(url);
FindCdmaRequest request = (FindCdmaRequest) getTestObject(FindCdmaRequest.class);
request.setDistNbr("027");
request.setNxxNbr("1330");
request.setLineNbr("%29%");
request.setCount(10);
request.setLocalNetId(1001);
PhoneNumber[] numbers = stub.findCdma(request).get_return();
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i].getAccNbr() + "," + numbers[i].getWorkAreaId() + ","
+ numbers[i].getAccNbrClassId() + "," + numbers[i].getAccNbrClassName() + ","
+ numbers[i].getAgentId() + "," + numbers[i].getWorkAreaId() + ","
+ numbers[i].getWorkAreaName() + "," + numbers[i].getIsAdvance());
}
assertNotNull(stub.findCdma(request));
}
错误日志
org.apache.axis2.AxisFault: weblogic.utils.AssertionError: ***** ASSERTION FAILED *****[ Failed to generate class for com.cattsoft.ibss.hub.intf.OSSInterface_trgpb2_HomeImpl_815_WLStub ] - with nested exception:
[java.lang.reflect.InvocationTargetException - with target exception:
[java.lang.IllegalAccessError: tried to access method weblogic.rmi.internal.StubInfo.getInterfaces(Ljava/lang/ClassLoader;)[Ljava/lang/Class; from class com.cattsoft.ibss.hub.intf.OSSInterface_trgpb2_HomeImpl_815_WLStub]]
at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:512)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:370)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:416)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
at com.ws.QiangHaoServiceStub.findCdma(QiangHaoServiceStub.java:186)
at test.QiangHaoServiceTest.testfindCdma(QiangHaoServiceTest.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
分享到:
相关推荐
数据源在JNDI中注册后,EJB或JPA可以通过JNDI查找机制来获取数据库连接,执行SQL语句,进行数据的读写操作。 这三者结合,为EJB+JPA的应用提供了完整的环境配置:"jboss-web.xml"定义了Web应用与EJB的交互方式,...
Service接口继承自`javax.xml.rpc.Service`,在J2EE环境中,通常通过JNDI(Java Naming and Directory Interface)查找来获取Service实例。以下是一个在J2EE环境中使用生成的Stub的示例代码: ```java package ...
2. **应用配置**:在Web应用的web.xml文件中,可以通过`<resource-ref>`元素声明对JNDI资源的引用。 3. **代码中使用**:在Java代码中,通过`InitialContext`实例化并调用`lookup()`方法查找资源。 ```java ...
在实际项目中,JNDI广泛应用于EJB(Enterprise JavaBeans)的查找、Web应用服务器的配置、JMS(Java Message Service)队列的定位等。理解并掌握JNDI对于任何Java开发者来说,都是提升分布式系统设计和实现能力的...
3. **JDBC数据源**:在Web应用服务器中,JNDI常用来查找和配置数据库连接池,使得应用程序可以通过名称直接获取数据源。 4. **Servlet上下文初始化参数**:在Servlet应用中,JNDI可以用来存储和检索全局配置信息,...
Tomcat 是一个流行的 Java Web 服务器,JNDI(Java Naming and Directory Interface)是 Java 中的一种命名和目录接口规范。Tomcat 中的 JNDI 数据源是指将数据库连接信息注册到 JNDI 服务器中,以便在应用程序中...
在本“Web Service开发指南_2.3”中,我们将深入探讨Java技术在Web服务开发中的应用。Java是Web服务开发中的重要语言,尤其通过Java API for XML Processing (JAXP)、Java API for XML Web Services (JAXWS) 和 Java...
在WebSphere上,JNDI通常用来管理和查找EJB(Enterprise JavaBeans)、数据源、邮件会话、JMS(Java Message Service)队列等。 发布基于JNDI的应用主要包括以下几个步骤: 1. **配置WebSphere应用服务器**:首先...
接下来,需要编辑`TOMCAT_HOME/conf/server.xml`文件,在`<Service>`标签内配置JNDI资源。 1. **定义Context** - 添加`<Context>`元素来指定DBTest应用的上下文路径和文档基础目录: ```xml debug="5" ...
2. 在上下文中查找Web服务:`Service abf = (Service) ic.lookup("java:comp/env/service/AddressBookService");` 这里,`AddressBookService`是Web服务的引用名,`java:comp/env`是JNDI的标准上下文,`service`是...
这通常在JBoss启动时自动完成,但也可以通过在`jboss-service.xml`或`standalone.xml`中添加相应配置来手动完成。 3. **应用程序访问**:在应用程序中,可以通过JNDI查找机制获取到数据源,如下所示: ```java ...
- **binding**:在JNDI中,binding是指将一个名称(或称作JNDI名称)与一个对象关联起来。这个名字可以用来查找并访问该对象。 - **Resolve**:解析过程是通过JNDI名称查找并返回对应对象的过程。 - **Context**:...
在JNDI中,客户端通过服务接口与服务提供者交互。服务提供者可以是任何类型的命名或目录服务,如 LDAP、DNS 或简单的文件系统。当客户端调用JNDI API进行操作时,JNDI服务会转发请求到相应的服务提供者,并将结果...
在Web服务器配置文件(如Tomcat的`server.xml`)中,可以通过配置`<Resource>`元素来定义JNDI数据源。 ```xml <Context path="/JNDI" reloadable="true" docBase="E:\workspace\JNDI" workDir="E:\workspace\JNDI\...
3. **Naming** - 在JNDI中,命名是通过一个层次化的名称空间进行的,类似于文件系统的路径。例如,`java:comp/env/jdbc/myDataSource` 就是一个JNDI名称,其中`java:comp/env`是上下文,`jdbc/myDataSource`是子名。...
Server配置通常包括全局JNDI资源、监听器、阀门(Valve)等,这些配置对所有Service都可见。 3. **Service组件** "Service"是Tomcat中的一个中间层,它定义了接收和处理HTTP请求的具体策略。一个Service至少包含一...
理解JNDI的工作原理和在Web应用中的使用方法。 5. **JTA与JMS**:Java Transaction API(JTA)和Java Message Service(JMS)是企业级Java应用中处理分布式事务和消息传递的关键技术。学习如何使用JTA进行事务管理...
在Web应用中,我们可能需要配置数据源(DataSource)等JNDI资源,以便于应用在运行时查找和使用。例如,在`context.xml`中,我们可以创建一个名为`jdbc/myDataSource`的数据源: ```xml type="javax.sql....
4. **解决Web开发中的相对路径问题**: 在Web应用中,处理URL路径是常见的挑战。正确使用相对路径和绝对路径,以及理解不同上下文路径对资源引用的影响,是避免路径问题的关键。有时需要利用Spring MVC或其他框架的...