1

Web サービスを使用して EJB を呼び出す、株式取引に関する Java EE アプリケーションがあります。データベースに追加のフィールドを追加するまで、すべて正常に機能していました。アプリは次の例外を与えます:

WARNING: A system exception occurred during an invocation on EJB StockCommodityEJB method public java.util.Collection ejb.StockCommodityEJB.getAllScrips()
javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean
    at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:5049)

    at $Proxy640.getAllScrips(Unknown Source)

    at service.StatelessWebService.getAllScrips(StatelessWebService.java:62)
    ....
    ...
com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:116)
    at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:212)
    ...

Caused by: Exception [EclipseLink-7092] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot add a query whose types conflict with an existing query. Query To Be Added: [ReadAllQuery(name="UserStock.findAll" referenceClass=UserStock jpql="SELECT u FROM UserStock u")] is named: [UserStock.findAll] with arguments [[]].The existing conflicting query: [ReadAllQuery(name="UserStock.findAll" referenceClass=UserStock jpql="SELECT u FROM UserStock u")] is named: [UserStock.findAll] with arguments: [[]].
    at org.eclipse.persistence.exceptions.ValidationException.existingQueryTypeConflict(ValidationException.java:902)
    at org.eclipse.persistence.internal.sessions.AbstractSession.addQuery(AbstractSession.java:422)
    at org.eclipse.persistence.internal.sessions.AbstractSession.addQuery(AbstractSession.java:395)
    at org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQueries(AbstractSession.java:2148)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:442)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:673)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:631)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:284)
    ...
com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:532)
    at ejb.StockCommodityEJB.getAllScrips(StockCommodityEJB.java:351)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    ...


SEVERE: The log message is null.
javax.ejb.EJBTransactionRolledbackException
    at ejb._StockCommodityEJBStateless_Wrapper.getAllScrips(ejb/_StockCommodityEJBStateless_Wrapper.java)
    at service.StatelessWebService.getAllScrips(StatelessWebService.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    ...

Caused by: javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
    org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:277)
    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:251)
    ...

Caused by: Exception [EclipseLink-7092] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot add a query whose types conflict with an existing query. Query To Be Added: [ReadAllQuery(name="UserStock.findAll" referenceClass=UserStock jpql="SELECT u FROM UserStock u")] is named: [UserStock.findAll] with arguments [[]].The existing conflicting query: [ReadAllQuery(name="UserStock.findAll" referenceClass=UserStock jpql="SELECT u FROM UserStock u")] is named: [UserStock.findAll] with arguments: [[]].
    at org.eclipse.persistence.exceptions.ValidationException.existingQueryTypeConflict(ValidationException.java:902)
    at org.eclipse.persistence.internal.sessions.AbstractSession.addQuery(AbstractSession.java:422)
    at org.eclipse.persistence.internal.sessions.AbstractSession.addQuery(AbstractSession.java:395)
    ...


WARNING: A system exception occurred during an invocation on EJB StatelessWebService method public java.util.Collection service.StatelessWebService.getAllScrips()
javax.ejb.EJBTransactionRolledbackException
    at ejb._StockCommodityEJBStateless_Wrapper.getAllScrips(ejb/_StockCommodityEJBStateless_Wrapper.java)
    at service.StatelessWebService.getAllScrips(StatelessWebService.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5366)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
    ...
    at $Proxy641.getAllScrips(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

Caused by: Exception [EclipseLink-7092] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot add a query whose types conflict with an existing query. Query To Be Added: [ReadAllQuery(name="UserStock.findAll" referenceClass=UserStock jpql="SELECT u FROM UserStock u")] is named: [UserStock.findAll] with arguments [[]].The existing conflicting query: [ReadAllQuery(name="UserStock.findAll" referenceClass=UserStock jpql="SELECT u FROM UserStock u")] is named: [UserStock.findAll] with arguments: [[]].
    at org.eclipse.persistence.exceptions.ValidationException.existingQueryTypeConflict(ValidationException.java:902)

    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:631)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:284)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:290)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:275)
    ...

SEVERE: Error Rendering View[/AdminTemplate/scripMaster.xhtml]
javax.el.ELException: /AdminTemplate/scripMaster.xhtml @50,61 value="#{manageScrip.scripList}": javax.xml.ws.soap.SOAPFaultException: javax.ejb.EJBTransactionRolledbackException
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
    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 org.primefaces.component.datatable.DataTable.getValue(DataTable.java:786)
    at javax.faces.component.UIData.getDataModel(UIData.java:1798)
    at javax.faces.component.UIData.getRowCount(UIData.java:356)
    at org.primefaces.component.api.UIData.calculatePage(UIData.java:116)

    ...
    at $Proxy643.getAllScrips(Unknown Source)
    at beans.manageScrip.getAllScrips(manageScrip.java:422)
    at beans.manageScrip.getScripList(manageScrip.java:180)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
    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:116)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:163)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:55)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    ... 48 more

WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
javax.xml.ws.soap.SOAPFaultException: javax.ejb.EJBTransactionRolledbackException
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193)
    ...

デバッグしたところ、ejb の getAllScrips メソッドで例外がスローされたことがわかりました。以下はマネージド Bean メソッドと Web サービス メソッドです。

private java.util.List<service.ScripMaster> getAllScrips() {
    service.StatelessWebService port = service.getStatelessWebServicePort();
    return port.getAllScrips();
}

public List<ScripMaster> getScripList() {
    scripList=new ArrayList<ScripMaster> ();
 scripList=getAllScrips();
    return scripList;
}

EJB メソッドは次のとおりです。

@Override
public Collection<ScripMaster> getAllScrips() {
    Collection<ScripMaster> scripCollection=null;
    scripCollection=em.createNamedQuery("ScripMaster.findAll").getResultList();
    return scripCollection;
}

scrip.findallクエリ:

@NamedQuery(name = "ScripMaster.findAll", query = "SELECT s FROM ScripMaster s")

編集: エンティティ クラス ScripMaster.java に、以下のコードを追加しました。

 @Column(name = "PreviousClose", precision = 22)
    private Double previousClose; //new column
    @Column(name = "Change", precision = 22)
    private Double change; //new column

そして彼らのゲッターセッターはそれをデートします。

これはどのように発生し、どうすれば解決できますか?

4

3 に答える 3

2

実際の問題は、この問題が発生し始めるかなり前にログに記録されており、実行しているクエリとは関係がない可能性があります。これがアプリケーションでの最初の EM アクセスであり、コンテナが EM をプロキシの背後にラップしているというだけです。

EclipseLink にはバグhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=376995があり、これは 2.4 で修正されており、デプロイ ステージが失敗した状態のときにこのエラーが発生します。失敗後にファクトリを使用しようとすると、JPQL クエリを再度追加しようとするため、このエラーが発生します。パッチは最初のエラーを保持して再スローするため、最初の原因を見つけやすくなります。したがって、EclipseLink 2.4 ナイトリー ビルドを使用してみることができますが、実際の原因は EMF の展開中にログに表示されるはずです。

新しいフィールドをサポートするためにアプリケーションに追加したコードは何ですか?

于 2012-05-22T16:14:06.603 に答える
1

クエリに別の名前を使用して回避しました。名前付きクエリの名前を「find」で始めると、問題が発生するようです。

于 2012-09-13T08:44:09.580 に答える
0

現在、どのEclipseバージョンを使用していますか?の問題ですEclipseLink 2.1.2

javax.persistence_2.0.4.v201112161009を使用してeclipselink.jarバージョン管理することをお勧めしますEclipseLink 2.4.1EclipseLink2.4.1をダウンロードする

于 2013-02-22T04:53:30.860 に答える