1

I'm getting a strange exception the SECOND time my remote ejb is called from my JSF Managed Bean. The first time the bean is called, the results are returned to the screen. However if I then click an action that calls the ejb for a second time, then I get the following Exception:

 SystemErr     R java.rmi.RemoteException: CORBA BAD_OPERATION 0x0 No; nested exception is: 
    org.omg.CORBA.BAD_OPERATION: The delegate has not been set!  vmcid: 0x0  minor code: 0  completed: No
[10/06/13 09:35:26:341 BST] 00000041 SystemErr     R    at com.ibm.CORBA.iiop.UtilDelegateImpl.mapSystemException(UtilDelegateImpl.java:330)
[10/06/13 09:35:26:341 BST] 00000041 SystemErr     R    at javax.rmi.CORBA.Util.mapSystemException(Util.java:84)
[10/06/13 09:35:26:341 BST] 00000041 SystemErr     R    at com.ibm.CORBA.iiop.UtilDelegateImpl.isLocal(UtilDelegateImpl.java:739)
[10/06/13 09:35:26:341 BST] 00000041 SystemErr     R    at javax.rmi.CORBA.Util.isLocal(Util.java:281)
[10/06/13 09:35:26:341 BST] 00000041 SystemErr     R    at com.ejb.view._BelgianBeerSessionBeanRemote_Stub.getAllBeveragesForCountry(_BelgianBeerSessionBeanRemote_Stub.java)
[10/06/13 09:35:26:341 BST] 00000041 SystemErr     R    at com.web.BeerStorePageBean.getBeersForCountry(BeerStorePageBean.java:64)

Does anyone know why this is and what I need to do to get around it?

The EJB and jsf are in separate web applications. The ejb interfaces and the jta entities are in a jar file that is within each application. As I said previously, the first call to retrieve the list of countries returns successfully, but a second call to get the beers for a country returns the follwing exception:

Here is my managed Bean.

@ManagedBean
@ViewScoped
public class BeerStorePageBean implements Serializable {

    private static final long serialVersionUID = -303245258622324227L;
    @EJB(lookup = "java:global/BelgianBeersEarProject/BelgianBeersEJBProject/BelgianBeerSessionBean!com.ejb.view.BelgianBeerSessionBeanRemote")
    private BelgianBeerSessionBeanRemote store;
    private List<Beverage> beverages = null;

    public List<Beverage> getBeverages() {
        return beverages;
    }

    public void setBeverages(List<Beverage> beverages) {
        this.beverages = beverages;
    }

    public BelgianBeerSessionBeanRemote getStore() {
        return store;
    }

    public void setStore(BelgianBeerSessionBeanRemote store) {
        this.store = store;
    }

    private List<Country> countries = null;

    @PostConstruct
    public void populateCountries() {
        countries = store.getAllCountries();

    }

    public List<Country> getAllCountries() {

        return countries;
    }

    public void getBeersForCountry(Country c) {

        try {
            setBeverages(getStore().getAllBeveragesForCountry(c.getId()));
        } catch (Exception e) {
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage("There was an error getting the beers: "
                            + e.getMessage()));
        }

    }



}

Here is my EJB:

@Stateless
public class BelgianBeerSessionBean implements BelgianBeerSessionBeanRemote,
        BelgianBeerSessionBeanLocal {

    private static final long serialVersionUID = 7878013037900683879L;
    @PersistenceContext(unitName = "BeerJPAProject")
    private EntityManager em;

    public BelgianBeerSessionBean() {
        // TODO Auto-generated constructor stub
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Country> getAllCountries() {

        TypedQuery<Country> q = em.createNamedQuery("getCountries",
                Country.class);
        return q.getResultList();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void saveCountries(List<Country> countries) {
        for (Country c : countries) {
            em.persist(c);
        }

    }

    @Override
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Beverage> getAllBeveragesForCountry(int countryId) {
        TypedQuery<Beverage> q = em.createNamedQuery("getBeveragesByCountry",
                Beverage.class);
        q.setParameter("countryId", countryId);
        return q.getResultList();
    }
}

Here are the ejb interfaces

public interface BelgianBeerSessionInterface extends Serializable {
    List<Country> getAllCountries();

    void saveCountries(List<Country> countries);

    List<Beverage> getAllBeveragesForCountry(int countryId);
}


@Remote
public interface BelgianBeerSessionBeanRemote extends
        BelgianBeerSessionInterface, Serializable{

}

@Local
public interface BelgianBeerSessionBeanLocal extends
        BelgianBeerSessionInterface {

}
4

1 回答 1

0

我相信这已由PM61337 修复,它修复了与 JSF 状态反序列化相关的各种问题。APAR 的异常表明本地 EJB 代理被错误地序列化,而您的问题是远程 EJB 代理/存根的反序列化不正确。

于 2013-06-10T19:23:41.023 回答