【问题标题】:Returning an entity via remote EJB results in - java.lang.NullPointerException at com.sun.corba.ee.impl.orbutil.ClassInfoCache$ClassInfo.<init>通过远程 EJB 返回实体会导致 - com.sun.corba.ee.impl.orbutil.ClassInfoCache$ClassInfo.<init> 处的 java.lang.NullPointerException
【发布时间】:2013-02-12 20:35:05
【问题描述】:

我正在尝试在以下环境中创建企业 Web 应用程序。

  • NetBeans 7.2.1
  • Glassfish Server 3.1.2(包含 Servlet 3.0 API)
  • EJB 3.1
  • JPA 2.0
  • JSF 2.1
  • jdk 1.7
  • Oracle 10g

我创建了一个类库(新项目 -> Java -> Java 类库)来放置将由无状态会话 bean 实现的远程 (javax.ejb.Remote) 接口。类库已添加到两个模块(EJB 和 WAR)的类路径中。

我已经把远程接口和所有的实体类放到了类库中(不知道是这样的)。

这适用于带有@Local 注释的接口。它甚至可以与 @Remote 一起使用,但是当我尝试返回实体的对象列表时,当 JPA 涉及时,它会失败并出现以下异常。

java.rmi.MarshalException: CORBA MARSHAL 1330446347 也许;嵌套的 例外是:org.omg.CORBA.MARSHAL:警告:IOP00810011:异常 来自 CDRInputStream vmcid 中 ValueHandler 上的 readValue:OMG 次要 代码:11 完成:也许

完整的堆栈跟踪。

javax.ejb.EJBException: java.rmi.MarshalException: CORBA MARSHAL 1330446347 Maybe; nested exception is: 
    org.omg.CORBA.MARSHAL: WARNING: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream  vmcid: OMG  minor code: 11 completed: Maybe
    at remote.admin.sessionbeans._AdminRemoteSessionBeanRemote_Wrapper.getZones(remote/admin/sessionbeans/_AdminRemoteSessionBeanRemote_Wrapper.java)
    at managedbeans.ZoneBean.getZones(ZoneBean.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:363)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:138)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:183)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UIData.getValue(UIData.java:731)
    at javax.faces.component.UIData.getDataModel(UIData.java:1798)
    at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
    at javax.faces.component.UIData.setRowIndex(UIData.java:473)
    at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
    at javax.faces.component.UIData.encodeBegin(UIData.java:1118)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1755)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.rmi.MarshalException: CORBA MARSHAL 1330446347 Maybe; nested exception is: 
    org.omg.CORBA.MARSHAL: WARNING: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream  vmcid: OMG  minor code: 11 completed: Maybe
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:267)
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.wrapException(Util.java:696)
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:259)
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
    at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:227)
    at remote.admin.sessionbeans.__AdminRemoteSessionBeanRemote_Remote_DynamicStub.getZones(remote/admin/sessionbeans/__AdminRemoteSessionBeanRemote_Remote_DynamicStub.java)
    ... 55 more
Caused by: org.omg.CORBA.MARSHAL: WARNING: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream  vmcid: OMG  minor code: 11 completed: Maybe
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
    at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
    at $Proxy193.valuehandlerReadException(Unknown Source)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1022)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1123)
    at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
    at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:2162)
    at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2404)
    at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1224)
    at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:425)
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:308)
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:274)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1015)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1123)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:935)
    at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:525)
    at com.sun.corba.ee.impl.copyobject.ORBStreamObjectCopierImpl.copy(ORBStreamObjectCopierImpl.java:78)
    at com.sun.corba.ee.impl.copyobject.ORBStreamObjectCopierImpl.copy(ORBStreamObjectCopierImpl.java:65)
    at com.sun.corba.ee.impl.orbutil.copyobject.FallbackObjectCopierImpl.copy(FallbackObjectCopierImpl.java:69)
    at com.sun.corba.ee.impl.orbutil.copyobject.FallbackObjectCopierImpl.copy(FallbackObjectCopierImpl.java:59)
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.copyObject(Util.java:771)
    at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.copyResult(DynamicMethodMarshallerImpl.java:473)
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:243)
    ... 58 more
Caused by: java.lang.NullPointerException
    at com.sun.corba.ee.impl.orbutil.ClassInfoCache$ClassInfo.<init>(ClassInfoCache.java:156)
    at com.sun.corba.ee.impl.orbutil.ClassInfoCache.get(ClassInfoCache.java:281)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1097)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:935)
    at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:525)
    at com.sun.corba.ee.impl.corba.TCUtility.unmarshalIn(TCUtility.java:289)
    at com.sun.corba.ee.impl.corba.AnyImpl.read_value(AnyImpl.java:605)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_any(CDRInputStream_1_0.java:775)
    at com.sun.corba.ee.impl.encoding.CDRInputObject.read_any(CDRInputObject.java:482)
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.readAny(Util.java:452)
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.read_Array(ValueHandlerImpl.java:639)
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:305)
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:274)
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1015)
    ... 77 more

远程接口:

@Remote
public interface AdminRemoteSessionBeanRemote {
    public List<Zone>getZones();
    public int sum(int a, int b);
}

实现上述接口的无状态会话bean:

@Stateless
public class AdminRemoteSessionBean implements AdminRemoteSessionBeanRemote {
    @PersistenceContext(unitName="unit-name")
    private EntityManager entityManager;

    @Override
    public List<Zone> getZones() {
        return entityManager.createNamedQuery("Zone.findAll").getResultList();
    }

    @Override
    public int sum(int a, int b) {
        return a + b;
    }
}

JSF 托管 bean:

@ManagedBean
@RequestScoped
public class ZoneBean {
    @EJB//(mappedName="remote.admin.sessionbeans.AdminRemoteSessionBeanRemote")
    private AdminRemoteSessionBeanRemote adminRemoteSessionBeanRemote;
    private List<Zone>zones;
    private int sum;

    public ZoneBean(){}

    public List<Zone> getZones() {
        zones=adminRemoteSessionBeanRemote.getZones();
        return zones;
    }

    public void setZones(List<Zone> zones) {
        this.zones = zones;
    }

    public int getSum() {
        sum=adminRemoteSessionBeanRemote.sum(10, 15);
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }
}

仅返回intsum() 方法仅用于演示。它按原样工作。

当涉及到一个实体时会出现问题,这可以在 EJB 中的 public List&lt;Zone&gt; getZones() 方法中看到,该方法会导致上述异常。

AdminClassLibrarysnapshot 中突出显示的节点)是包含远程接口和实体类的类库。

如何通过EJB会话bean中的getZones()方法返回java.util.List&lt;entities.Zone&gt;

我已点击 Google 显示的有关此异常的所有链接,但无法找到解决方案。


Zone 实体。

@Entity
@Table(name = "ZONE", catalog = "", schema = "PROJECTDB")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Zone.findAll", query = "SELECT z FROM Zone z ORDER BY z.zoneId DESC"),
    @NamedQuery(name = "Zone.findByZoneId", query = "SELECT z FROM Zone z WHERE z.zoneId = :zoneId"),
    @NamedQuery(name = "Zone.findByZone", query = "SELECT z FROM Zone z WHERE z.zone = :zone")})
public class Zone implements Serializable {
    private static final long serialVersionUID = 1L;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "ZONE_ID")
    private BigDecimal zoneId;
    @Size(max = 50)
    @Column(name = "ZONE")
    private String zone;
    @OneToMany(mappedBy = "zoneId", fetch = FetchType.LAZY)
    private List<Country> countryList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "zone", fetch = FetchType.LAZY)
    private List<ZoneCharge> zoneChargeList;
    @JoinColumn(name = "TRANSPORTER_ID", referencedColumnName = "TRANSPORTER_ID")
    @ManyToOne(fetch = FetchType.LAZY)
    private Transporter transporterId;

    //Getters and setters + constructor(s) + equals() + hashcode()
}

【问题讨论】:

  • 你也可以发布Zone 类吗?
  • @Carlo Pellegrini - 鉴于该课程。谢谢。

标签: jakarta-ee glassfish ejb corba


【解决方案1】:

问题在于Zone 类实例的反序列化。它应该是Serializable,并且应该存在于客户端和服务器(本地和远程)上。这也将强加一个依赖关系以将持久性库添加到远程服务器。因此最好不要发送持久性实体。

【讨论】:

  • 谢谢。 Zone 实体已经实现了java.io.Serializable 接口。因此,我认为它应该被序列化。就我而言,客户端是 Web 模块 (WAR)。远程接口存在于 WAR 和 EJB 模块以及类库中。对不起,我没有得到。
  • 我的意思是实体区域也应该出现在 WAR 中。并且要在 WAR 中包含实体区域,您必须将所有依赖的 jar 也放在 WEB-INF/lib 中。
  • 我已经在 web-war 模块中复制了包含 Zone 实体的包,但我得到了与问题中提到的相同的异常。它适用于 NetBeans 6.9.1,我尝试过不要求将远程接口放在单独的类库中。我不知道如何使用 NetBeans 7.x 构建这样的应用程序。谢谢。
  • 还要检查 WAR 是否包含 Zone 类的依赖项,例如 ejb 持久性 jar。
  • 我仍然无法解决相关问题。我将奖励您的答案,但现在不接受它,以便它在未回答的问题列表中可用,如果有人仍然可以揭露我可能遗漏的东西,我以后可能会有更好的运气来解决问题。非常感谢您的努力。
【解决方案2】:

我刚刚遇到了这个问题的一个例子。我调用的远程方法引发了异常(实际上是 PSQLException)。我认为 PSQLException 被包装并最终序列化并发送给我的客户。我的客户端在其类路径中没有 PSQLException,这在 CORBA 的内部似乎没有得到很好的处理。

我通过将调试器连接到客户端应用程序并在 NullPointerException 的构造函数上放置断点来诊断这一点。然后,我可以看到在抛出异常时正在反序列化哪个类。

祝你好运!

【讨论】:

    【解决方案3】:

    在尝试从远程 ejb 调用中获取实体集合后,我也得到了错误堆栈跟踪。 将jdk升级到1.8_60及以上完全解决了问题。它现在运行得很好,没有错误堆栈。这个bug已经解决了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 2023-03-03
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2011-08-10
      相关资源
      最近更新 更多