Не удалось упорядочить параметры EJB --- IllegalArgumentException: невозможно установить поле org.apache.commons.collections.FastHashMap
При попытке сохранить результаты поиска с помощью удаленного интерфейса для SearchFacade.java
"Failed to marshal EJB parameters"
Невозможно установить для org.apache.commons.collections.FastHashMap поле org.apache.commons.validator.Field.hMsgs значение org.apache.commons.collections.FastHashMap для sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException.orj.
Я использую Struts 1.1, EJB 2.1, использую jd-файлы xdoclet 1.2.3 для генерации файлов зависимостей (что неизбежно использовать), где мои локальные, домашние интерфейсы создаются с использованием Xdoclet.
Я также использую Java 6, Jboss EAP 6.1 Alpha в моем проекте.
Примечание: тот же код отлично работает при запуске в Jboss 4.0
Так что удивительно, что мой удаленный вызов правильный.
Любая помощь приветствуется.
Журналы ошибок
java.lang.RuntimeException: JBAS014154: не удалось маршалировать параметры EJB в org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:270) в org.jboss.as.ejb3.remote.LocaljbceceReRe.java:259) в org.jboss.as.ejb3.remote.LocalEjbReceiver.processInvocation(LocalEjbReceiver.java:170) в org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClijteoc.jj) ejb.client.EJBHomeCreateInterceptor.handleInvocation(EJBHomeCreateInterceptor.java:79) в org.jboss.ejb.client. EJBClientInvocationContext.sendRequest 42) в org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:183) в org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInteroclij.jj.jj).sendRequest (EJBClientInvocationContext.java: 183) по адресу org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:177) по адресу org.jboss.ejb.client.EJBInvocationHandler.doInvoke (EJBInvocation:16.jb.jb) EJBInvocationHandler.invoke(EJBInvocationHandler.java:124) в $Proxy25.saveSearch(Неизвестный источник) в com.web.history.SearchFormDelegate.saveSearch(SearchFormDelegate.java:177) в com.history.chear.SearSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSa.) в com.history.SaveSearchAction.executeSynchronized(SaveSearchAction.java:296) в com.dispatch.SynchronizedAction.execute(SynchronizedAction.java:206) в org.apache.struts.action.RequestProcessor.processActionPerform:: в org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) в org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) в org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) в javax.servlet.http.HttpServlet.service(HttpServlet.java:754) в javax.servlet.http.HttpServlet.:214) в com.security.AuthenticationFilter.doFilter(AuthenticationFilter.java:672) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) в org.apache.catalina.FilApp. ApplicationFilterChain.java:214) в com.planetj.servlet.filter.compression.CompressingFilter.doFilter(CompressingFilter.java:270) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChaache.j)) или ApplicationFilterChain.j)..catalina.core.:149) на org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) в org.apache. Java:97) в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) в org.apache.coyote.Http11Processor.process(Http11Processor.java:856) в org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) в org.apache.tomcat.util.net.JIoEnd для точки org.apache.tomcat.util.net.JIoEnd.java:920) at java.lang.Thread.run(Thread.java:662) Причина: java.lang.IllegalArgumentException: Невозможно установить поле org.apache.commons.collections.FastHashMap org.apache.commons.validator.Field.hMsgs to org.apache.commons.collections.FastHashMap at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) при sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) в sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) в java.lang.reflect.Field.set(Field.java:657) в org.jboss.marshalling.cloner.SerializingCloner.storeFields(SerializingCloner.java:368) в org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:31h. Org.org). Org. Org.SerializingCloner.clone(SerializingCloner.java:253) в org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) в org.jboss.marshalling.cloner.SerializingCloner.clone348j org at org.jboss.marshalling.cloner..java: 134) на org.jboss.marshalling.cl ONER.SerializingCloner.io.ObjectInputStream.readObject(ObjectInputStream.java:344) в java.util.HashMap.readObject(HashMap.java:1030) в sun.reflect.GeneratedMethodAccessor119.invoke(Unknown Source) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) на java.lang.reflect.Method.invoke(Method.java:597) на org.jboss.marshalling.reflect.SerializableClass.callReadObject(SerializableClass.java:218) на org.jboss.marshalling.onon.SerializingCloner.initSerializableClone(SerializingCloner.java:302) в org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:253) в org.jboss.marshalling.cloner.SerializingClonerer: orone.clone.jboss.marshalling.cloner.SerializingCloner.cloneFields(SerializingCloner.java:348) в org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:309) в org.jboss.marshalling.cloner.SerializingClonerglone.jboss.marshalling.cloner..java: 309) по адресу org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:285) по адресу org.jboss.marshalling.cloner.SerializingCloner.clone (SerializingCloner.java:allss. org. Клонер на org.jboss.marshalling.cloner.S erializingCloner.clone (SerializingCloner.java:253) в org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) в org.jboss.as.ejb3.remote.LocalEjbReceiver.clone:jj.java (Local)... еще 42
Код:
saveAction.java
protected void newSavedSearch(final SrchFrmDelegate sfd,
final String userId, final HttpServletRequest request,
final SaveSearchForm form) throws RemoteException,
UsrNotFoundException {
BseSrchValue srchValue = SrchResultsAction.retrieveSrchCriteria(request);
FrmLayout frmLayout = (FrmLayout) request.getSession().getAttribute(
FrmBuilderAction.FRM_LAYOUT_KEY);
Integer resultCount = null;
SrchResultValue srchResult = SearchResultsAction.retrieveSearchResults(request);
if (srchResult != null) {
resultCount = new Integer(srchResult.getTotal());
}
sfd.saveSearch(userGuid,
form.getTitle(),
form.getDesc(),
form.getNewTtle(),
srchValue,
frmLayout,
resultCount,
form.getSearches());
}
SrchFrmDelegate.java
/**
* Reference to the remote interface.
*/
private SrhFrmFacadeRemote srhFacadeRemote;
public String saveSearch(final String userId, final String srchTtle,
final String srchDesc, final Boolean newTtle,
final BsSearchValue srchValue, final FrmLay frmLay,
final Integer resultCount, final List alerts)
throws UsrNotFoundException,
RemoteException {
return srhFacadeRemote.saveSearch(userId, srchTtle,
srchDesc, newTtle, srchValue, frmLay,
resultCount, alerts);
}
SrchFrmFacadeRemote.java
/**
* Remote interface for SrchFrmFacade.
*/
public java.lang.String saveSearch( java.lang.String userId,java.lang.String srchTtle,java.lang.String srchDesc,java.lang.Boolean newTtle,com.common.search.BsSearchValue srchValue,com.common.search.advanced.FrmLay frmLay,java.lang.Integer resultCount,java.util.List alerts ) throws com.common.admin.UserNotFoundException, java.rmi.RemoteException;
3 ответа
Объекты, переданные в качестве параметров или в качестве ответа на удаленные вызовы, должны быть сериализуемыми.
пример:-
public class APIGetVerificationProofs implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String fileName;
private String mimeType;
private String itemId;
private String type;
.
.
.
.
}
В EJB3 эта ошибка также может возникать при вызове EJB Session Bean через @Remote
вид на EJB. В зависимости от дизайна и сценария использования вы можете вызывать EJB через @Local
интерфейс. С использованием @Local
интерфейс устранит необходимость в параметрах, которые будут Serializable
но это может заметно изменить ваш дизайн. При использовании @Local
просмотр это вариант для вас, вы можете просто добавить @Local
в EJB, не удаляя @Remote
,
После добавления приведенных ниже jar-файлов в модули Jboss 7 и соответствующего изменения файла standalone.xml проблема устранена.
jboss-eap-6.1.0.Alpha \ modules \ system \ layer \ base \ org \ apache \ commons \ validator commons-validator-1.1.0.jar
jboss-eap-6.1.0.Alpha \ modules \ system \ layer \ base \ org \ apache \ commons \ collection commons-collection-3.2.1.jar
В Standalone.xml
<subsystem xmlns="urn:jboss:domain:ee:1.1">
<spec-descriptor-property-replacement>false</spec-descriptor-property-replacement>
<jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement>
<global-modules>
<module name="org.apache.commons.collections" slot="main"/>
<module name="org.apache.commons.validator" slot="main"/>
</global-modules>
</subsystem>
Не забудьте добавить serialVersionUID, чтобы класс мог быть сериализован и восстановлен (сгенерируйте его как метод получения или установки)
Для решения этой проблемы сначала вы должны реализовать интерфейс Serializable в своем классе POJO (Java beans) как:
package com.test;
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private int empID;
private String empName;
private int empSalary;
public int getEmpID() {
return empID;
}
//alt_shift_s_r-getter and setter method
//alt_shift_s_s override toString()
public void setEmpID(int empID) {
this.empID = empID;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int getEmpSalary() {
return empSalary;
}
public void setEmpSalary(int empSalary) {
this.empSalary = empSalary;
}
@Override
public String toString() {
return "Employee [empID=" + empID + ", empName=" + empName + ", empSalary=" + empSalary + "]";
}
}
Примечание: если вы добавляете в свой проект несколько внешних jar-файлов, выполните следующую процедуру, чтобы добавить jar-файлы.
- Щелкните правой кнопкой мыши проект EJB и перейдите в свойства.
- Затем выберите сборку развертывания, затем нажмите "Добавить".
- В появившейся опции выберите соответствующий источник (как архив из файловой системы), затем перейдите к следующему.
Теперь добавьте банки из желаемого места и завершите процедуру.
enter code here