最近在研究EJB3,经常使用GlassFish。按照JavaEE规范,如果在EJB3的远程接口中需要传递自定义的数据类型,只要让定义的类实现java.io.Serializable接口,然后保证类中每一个字段都是实现了java.io.Serializable接口即可进行远程数据传递。比如一个远程接口的定义如下:
@javax.ejb.Remote
public interface ProductManager {
java.util.List<po.Product> findAll();
//.....
}
则po.Product类的定义则应该如下:
public class Product implements java.io.Serializable{
private int no;
private String name;
private String from;
//...
}
原来经常写这样的代码,也没有出过什么问题。但这次偏偏问题就来了。在创建一个EJB项目,完成代码后,部署到GlassFish之后(项目采用的是GlassFish中的目录部署模式),利用远程的Java客户端调用findAll方法时,却总是出现这样的错误:
"IOP02400001: (DATA_CONVERSION) 字符未映射至协商的传输代码集"
org.omg.CORBA.DATA_CONVERSION: vmcid: OMG minor code: 1 completed: No
at com.sun.corba.ee.impl.logging.OMGSystemException.charNotInCodeset(OMGSystemException.java:2093)
at com.sun.corba.ee.impl.logging.OMGSystemException.charNotInCodeset(OMGSystemException.java:2111)
at com.sun.corba.ee.impl.encoding.CodeSetConversion$JavaCTBConverter.convertCharArray(CodeSetConversion.java:336)
at com.sun.corba.ee.impl.encoding.CodeSetConversion$JavaCTBConverter.convert(CodeSetConversion.java:249)
at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeString(CDROutputStream_1_0.java:504)
at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_string(CDROutputStream_1_0.java:493)
at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_codebase(CDROutputStream_1_0.java:1379)
at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeValueTag(CDROutputStream_1_0.java:1423)
at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeRMIIIOPValueType(CDROutputStream_1_0.java:815)
at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:935)
at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:949)
at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:690)
at com.sun.corba.ee.impl.encoding.CDROutputStream.write_value(CDROutputStream.java:451)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.write(DynamicMethodMarshallerImpl.java:376)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.writeResult(DynamicMethodMarshallerImpl.java:472)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:158)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: java.nio.charset.UnmappableCharacterException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:261)
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:771)
at com.sun.corba.ee.impl.encoding.CodeSetConversion$JavaCTBConverter.convertCharArray(CodeSetConversion.java:321)
... 23 more
利用调试和跟踪工具,发现就是在findAll方法在回传结果时抛出的异常。开始觉得这个错误有些莫名奇妙,后来发现,我的项目的所在的目录位于Windows的“我的文档”目录中,而我的文档对应的用户名是中文。于是我换了一个纯英文目录存储项目,然后再在GlassFish中部署,就一切OK了!
看来,这是GlassFish的一个Bug:
如果你在远程商业方法中传递的自己定义的类的实例,那么请确保项目部署的目录所在的路径中没有中文的文件夹,否则会产生上述错误。
如果回传的数据是Java中的基础类库中的类型,比如String、int这样的简单数据类型,则不会产生这个错误。
这里也希望各位朋友注意这个问题,其实,这个中文路径的问题不只限于GlassFish,如果你在JavaSE项目中使用基于TopLink的JPA,假如你的程序运行所在的目录是中文,或该目录位于一个包含中文的路径中,也会遇到TopLink报告的不能正常初始化持久单元的错误。所以,在Java开发时,应避免使用包含有中文目录的路径。
分享到:
相关推荐
Java EE 5是Java企业级平台的一个重要里程碑,它简化了企业应用的开发,引入了许多新特性,包括: 1. **注解驱动的开发**:Java EE 5引入了如`@EJB`, `@PersistenceContext`, `@WebServiceRef`等注解,使得开发者...
**Project GlassFish** 是一个开源项目,致力于提供高质量的企业级应用服务器解决方案。它基于Java EE 5规范开发,并作为该规范的参考实现(Reference Implementation)。这使得GlassFish不仅在技术上紧跟最新的Java...
MAT 是一个功能强大且易用的工具,可以帮助我们快速地分析和解决内存泄露问题。 首先,我们需要使用 jps 和 jmap 工具来 dump 堆 heap 内存。然后,我们可以使用 MAT 来分析 dump 下来的 heap 文件。在 MAT 中,...
如果一个SFSB的方法应该增加一个计数器但每次调用时都返回1,那可能表明会话状态没有正确地保持或更新。这可能是由于以下原因: 1. **序列化问题**:SFSB在集群环境中需要被序列化和反序列化,以在不同服务器之间...
在Glassfish 4.1应用程序服务器环境中,尤其是在使用JavaServer Faces (JSF) 2.2渲染XHTML页面时,一个常见的问题是标题列中的图片会因布局问题而撑开。这个问题主要源于JSF 2.2对HTML5友好标记的支持,以及可能存在...
例如,如果一个特定的Java库在某个版本中引入了新特性或修复了重大bug,那么升级到这个版本可能会带来显著的性能提升或稳定性改善。 gfversions工具的使用场景包括但不限于: 1. **故障排查**:当遇到与组件版本...
2、调整了JadeTool中事务方式写文件的方法,新增了一个删除目录的方法;3、去掉DbConnection早期数据源名称需要加"java:comp/env/"前缀的做法,修订后,是否需要加此前缀,请用户根据需要决定。已在Tomcat、...
BugTime是一个基于Java EE 5技术的开源错误跟踪系统,专为开发者和团队提供高效、便捷的问题管理和解决工具。它允许用户记录、分类、追踪以及优先处理软件开发过程中遇到的各种bug和问题,极大地提高了团队协作效率...
M1代表第一个 Milestone 版本,意味着它包含了新功能的初步实现,可能包含一些未解决的bug,但已经足够展示新特性。 此JAR文件是ActiveMQ的资源适配器,它允许应用程序服务器如JBoss、WebLogic或Glassfish等与...
部署成功后,NetBeans会提供一个WSDL(Web Services Description Language)文件,这是一个XML文档,详细描述了Web服务的接口和操作。 在测试Web服务时,NetBeans提供了一个内置的测试客户端,你可以在这里输入参数...
标题中的“tomcat服务下载(比较稳定)”指的是获取Tomcat服务器的一个稳定版本。Tomcat是Apache软件基金会下的一个开源项目,它是一个流行的Java Servlet容器,特别用于运行JSP和Servlet应用。这里的“比较稳定”...
如何让一个应用响应一个特定端口 使用JNDI 使用JNDI 在JNDI中配置数据源(DataSource) 内嵌Jetty服务器 内嵌Jetty教程 内嵌Jetty的HelloWorld教程 内嵌Jetty视频 优化Jetty 如何配置垃圾收集 如何配置以支持高负载 ...
在Java Web开发中,Servlet是一个Java编程语言编写的服务器端程序,主要功能是处理来自客户端(通常是Web浏览器)的请求,并向客户端发送响应。JSP则是Servlet的一种扩展,允许开发者通过HTML模板语法来编写动态网页...
2. Apache Ant:Apache Ant是一个开源的构建工具,专为Java环境设计,但也可用于其他语言。它允许开发者将构建过程自动化,包括编译、测试和部署。Ant以其灵活性著称,不受特定编码约定或目录布局的限制,同时支持...
TestNG则是JUnit的一个扩展,由Cedric Beust创建。它引入了更多高级特性,如支持多线程测试、依赖于其他测试的测试、更丰富的异常处理和报告等。TestNG的`@Test`注解可以接受多个参数,如`enabled`、`priority`,...
Apache Tomcat 7.0.67 是一个广泛使用的开源软件,它是一个符合Java Servlet和JavaServer Pages(JSP)规范的应用服务器,主要用于部署和运行Java Web应用程序。这个版本是Tomcat 7系列的一个特定发布,它包含了多个...
Apache Tomcat 9.0.63 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的Web应用服务器。它是Apache软件基金会的项目之一,专注于实现Java EE(现在称为Jakarta EE)的Web部分。在这个...
对于开发人员来说,Tomcat8提供了一个轻量级且高效的平台,可以在本地环境中快速测试和调试Java Web应用程序。其日志系统和JMX(Java Management Extensions)接口也便于监控和诊断问题。 总的来说,Apache Tomcat8...
总结,FusionForge(前身为GlassFish)是一个强大且功能丰富的Web服务器,特别适合软件开发团队协作。了解并掌握其核心功能和配置方法,可以帮助你搭建一个高效、安全的企业级协作平台。无论是项目管理、代码版本...