`
hdwangyi
  • 浏览: 183487 次
社区版块
存档分类
最新评论

GlassFish中的一个Bug

    博客分类:
  • Java
阅读更多
最近在研究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开发时,应避免使用包含有中文目录的路径。
分享到:
评论
1 楼 阿刚炖蛋 2008-07-09  
又是中文目录造成的异常!!
记录下了~

相关推荐

    GlassFish源码

    Java EE 5是Java企业级平台的一个重要里程碑,它简化了企业应用的开发,引入了许多新特性,包括: 1. **注解驱动的开发**:Java EE 5引入了如`@EJB`, `@PersistenceContext`, `@WebServiceRef`等注解,使得开发者...

    glassfish-6_2007

    **Project GlassFish** 是一个开源项目,致力于提供高质量的企业级应用服务器解决方案。它基于Java EE 5规范开发,并作为该规范的参考实现(Reference Implementation)。这使得GlassFish不仅在技术上紧跟最新的Java...

    技術分享_Glassfish 3.1.2.2 Web Service Memory Leak Workaround1

    MAT 是一个功能强大且易用的工具,可以帮助我们快速地分析和解决内存泄露问题。 首先,我们需要使用 jps 和 jmap 工具来 dump 堆 heap 内存。然后,我们可以使用 MAT 来分析 dump 下来的 heap 文件。在 MAT 中,...

    测试工程(netbeans8.1,NetBeans自带glassfish4.1,JDK7)

    如果一个SFSB的方法应该增加一个计数器但每次调用时都返回1,那可能表明会话状态没有正确地保持或更新。这可能是由于以下原因: 1. **序列化问题**:SFSB在集群环境中需要被序列化和反序列化,以在不同服务器之间...

    glassfish 4.1 AP 標題列圖片撐開排除方法1

    在Glassfish 4.1应用程序服务器环境中,尤其是在使用JavaServer Faces (JSF) 2.2渲染XHTML页面时,一个常见的问题是标题列中的图片会因布局问题而撑开。这个问题主要源于JSF 2.2对HTML5友好标记的支持,以及可能存在...

    gfversions:GlassFish 组件版本查看器

    例如,如果一个特定的Java库在某个版本中引入了新特性或修复了重大bug,那么升级到这个版本可能会带来显著的性能提升或稳定性改善。 gfversions工具的使用场景包括但不限于: 1. **故障排查**:当遇到与组件版本...

    HashMap关系数据映射技术软件jadepool-1.1-GBK

    2、调整了JadeTool中事务方式写文件的方法,新增了一个删除目录的方法;3、去掉DbConnection早期数据源名称需要加"java:comp/env/"前缀的做法,修订后,是否需要加此前缀,请用户根据需要决定。已在Tomcat、...

    bugtime-开源

    BugTime是一个基于Java EE 5技术的开源错误跟踪系统,专为开发者和团队提供高效、便捷的问题管理和解决工具。它允许用户记录、分类、追踪以及优先处理软件开发过程中遇到的各种bug和问题,极大地提高了团队协作效率...

    activemq-ra-3.1-M1.jar.zip

    M1代表第一个 Milestone 版本,意味着它包含了新功能的初步实现,可能包含一些未解决的bug,但已经足够展示新特性。 此JAR文件是ActiveMQ的资源适配器,它允许应用程序服务器如JBoss、WebLogic或Glassfish等与...

    web service事例代码

    部署成功后,NetBeans会提供一个WSDL(Web Services Description Language)文件,这是一个XML文档,详细描述了Web服务的接口和操作。 在测试Web服务时,NetBeans提供了一个内置的测试客户端,你可以在这里输入参数...

    tomcat服务下载(比较稳定)

    标题中的“tomcat服务下载(比较稳定)”指的是获取Tomcat服务器的一个稳定版本。Tomcat是Apache软件基金会下的一个开源项目,它是一个流行的Java Servlet容器,特别用于运行JSP和Servlet应用。这里的“比较稳定”...

    Jetty中文手册

    如何让一个应用响应一个特定端口 使用JNDI 使用JNDI 在JNDI中配置数据源(DataSource) 内嵌Jetty服务器 内嵌Jetty教程 内嵌Jetty的HelloWorld教程 内嵌Jetty视频 优化Jetty 如何配置垃圾收集 如何配置以支持高负载 ...

    apache-tomcat-7.0.42

    在Java Web开发中,Servlet是一个Java编程语言编写的服务器端程序,主要功能是处理来自客户端(通常是Web浏览器)的请求,并向客户端发送响应。JSP则是Servlet的一种扩展,允许开发者通过HTML模板语法来编写动态网页...

    5款工具助你写出更好的Java代码

    2. Apache Ant:Apache Ant是一个开源的构建工具,专为Java环境设计,但也可用于其他语言。它允许开发者将构建过程自动化,包括编译、测试和部署。Ant以其灵活性著称,不受特定编码约定或目录布局的限制,同时支持...

    java各种测试jar包

    TestNG则是JUnit的一个扩展,由Cedric Beust创建。它引入了更多高级特性,如支持多线程测试、依赖于其他测试的测试、更丰富的异常处理和报告等。TestNG的`@Test`注解可以接受多个参数,如`enabled`、`priority`,...

    tomcat7.0.67

    Apache Tomcat 7.0.67 是一个广泛使用的开源软件,它是一个符合Java Servlet和JavaServer Pages(JSP)规范的应用服务器,主要用于部署和运行Java Web应用程序。这个版本是Tomcat 7系列的一个特定发布,它包含了多个...

    apache-tomcat-9.0.63

    Apache Tomcat 9.0.63 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的Web应用服务器。它是Apache软件基金会的项目之一,专注于实现Java EE(现在称为Jakarta EE)的Web部分。在这个...

    Apache Tomcat8

    对于开发人员来说,Tomcat8提供了一个轻量级且高效的平台,可以在本地环境中快速测试和调试Java Web应用程序。其日志系统和JMX(Java Management Extensions)接口也便于监控和诊断问题。 总的来说,Apache Tomcat8...

    flassfish Web服务器

    总结,FusionForge(前身为GlassFish)是一个强大且功能丰富的Web服务器,特别适合软件开发团队协作。了解并掌握其核心功能和配置方法,可以帮助你搭建一个高效、安全的企业级协作平台。无论是项目管理、代码版本...

Global site tag (gtag.js) - Google Analytics