2

I'm getting the below error while trying to save a search results using the Remote interface for SearchFacade.java

"Failed to marshal EJB parameters"

Can not set org.apache.commons.collections.FastHashMap field org.apache.commons.validator.Field.hMsgs to org.apache.commons.collections.FastHashMap at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) at

I'm Using struts 1.1, EJB 2.1 using xdoclet 1.2.3 jars for generating the dependency files.(which is inevitable to use), Where my Local,Home interfaces are being generated using Xdoclet..

I'm also using Java 6, Jboss EAP 6.1 Alpha in my project.

Note: The same code works fine when running in Jboss 4.0

So wonder is my remote calling is correct.

Any help is welcome.

Error Logs

java.lang.RuntimeException: JBAS014154: Failed to marshal EJB parameters at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:270) at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:259) at org.jboss.as.ejb3.remote.LocalEjbReceiver.processInvocation(LocalEjbReceiver.java:170) at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181) at org.jboss.ejb.client.EJBHomeCreateInterceptor.handleInvocation(EJBHomeCreateInterceptor.java:79) at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:183) at org.jboss.ejb.client.TransactionInterceptor.handleInvocation(TransactionInterceptor.java:42) at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:183) at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:125) at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:183) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:177) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:161) at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:124) at $Proxy25.saveSearch(Unknown Source) at com.web.history.SearchFormDelegate.saveSearch(SearchFormDelegate.java:177) at com.history.SaveSearchAction.createNewSavedSearch(SaveSearchAction.java:109) at com.history.SaveSearchAction.executeSynchronized(SaveSearchAction.java:296) at com.dispatch.SynchronizedAction.execute(SynchronizedAction.java:206) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at com.security.AuthenticationFilter.doFilter(AuthenticationFilter.java:672) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at com.planetj.servlet.filter.compression.CompressingFilter.doFilter(CompressingFilter.java:270) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.IllegalArgumentException: Can not set org.apache.commons.collections.FastHashMap field org.apache.commons.validator.Field.hMsgs to org.apache.commons.collections.FastHashMap at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) at java.lang.reflect.Field.set(Field.java:657) at org.jboss.marshalling.cloner.SerializingCloner.storeFields(SerializingCloner.java:368) at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:313) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:253) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) at org.jboss.marshalling.cloner.SerializingCloner.cloneFields(SerializingCloner.java:348) at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:309) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:253) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) at org.jboss.marshalling.cloner.SerializingCloner$StepObjectInput.doReadObject(SerializingCloner.java:836) at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:37) at org.jboss.marshalling.MarshallerObjectInputStream.readObjectOverride(MarshallerObjectInputStream.java:57) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:344) at java.util.HashMap.readObject(HashMap.java:1030) at sun.reflect.GeneratedMethodAccessor119.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.marshalling.reflect.SerializableClass.callReadObject(SerializableClass.java:218) at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:302) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:253) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) at org.jboss.marshalling.cloner.SerializingCloner.cloneFields(SerializingCloner.java:348) at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:309) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:253) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) at org.jboss.marshalling.cloner.SerializingCloner.cloneFields(SerializingCloner.java:348) at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:309) at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:285) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:253) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) at org.jboss.marshalling.cloner.SerializingCloner.cloneFields(SerializingCloner.java:348) at org.jboss.marshalling.cloner.SerializingCloner.initSerializableClone(SerializingCloner.java:309) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:253) at org.jboss.marshalling.cloner.SerializingCloner.clone(SerializingCloner.java:134) at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:268) ... 42 more

Code:

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;
Derrick
  • 3,669
  • 5
  • 35
  • 50
lee b
  • 61
  • 1
  • 2
  • 6

5 Answers5

5

Objects that passed as parameters or as response on remote calls must be Serializable.

example:-

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;
   .
   .
   .
   .
}
Lokesh
  • 3,247
  • 2
  • 33
  • 62
2

After adding the below jars in Jboss 7 modules & altering the standalone.xml file accordingly, Issue is fixed.

jboss-eap-6.1.0.Alpha\modules\system\layers\base\org\apache\commons\validator commons-validator-1.1.0.jar

jboss-eap-6.1.0.Alpha\modules\system\layers\base\org\apache\commons\collections commons-collections-3.2.1.jar

In 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>
Derrick
  • 3,669
  • 5
  • 35
  • 50
lee b
  • 61
  • 1
  • 2
  • 6
2

In EJB3 this error can also occur when invoking an EJB Session Bean across a @Remote view of the EJB. Depending on the design and usage scenario, you may be able to invoke the EJB over a @Local interface. Using the @Local interface will eliminate the requirement for the parameters to be Serializable but this can markedly change your design. If using the @Local view is an option for you, you can simply add the @Local to the EJB without removing the @Remote.

public class MySessionBeanImpl implements MySessionBean {
...
}

@Local
@Remote
public interface MySessionBean {
...
}

The JEE App Server will make the right decision to use the local view if the client of the invocation is in-container. According to the API docs, the Local annotation can appear on either the class or the interface. If on the class, the value attribute must be specified.

dan
  • 741
  • 9
  • 14
0

remember to add serialVersionUID to let class to be serialized and restored (generate it as getter or setter)

Rafal Iwaniak
  • 161
  • 1
  • 12
0

For this problem first, you have to implement Serializable interface in your POJO class (java beans) as:

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 + "]";
    }


}

Note: if you are adding some external jars into your project then follow the below procedure to add jars.

  1. Right Click on your EJB project and go to properties.
  2. Then Select Deployment assembly then clicks on add.
  3. From the appears option select appropriate source (As Archive from File System) then go to next.
  4. Now Add jars from your desired location and finish the procedure.

    enter code here
    
dariush
  • 3,191
  • 3
  • 24
  • 43