Implementation of EJB

I need some help with EJBs:
I can implement a Session EJB (in the admin console) and add it with no problems in "EJB -> add Set of Session EJBs"
I create a wrapper for that EJB (drag&drop in Page1) and use it.
If I modify the EJB (add a method) and implement it again (after I remove the old one), I can't use the new method...it appears in the list of methods but I can't bind it to a Table for example (it returns an ArrayList).
If I create a new project I can perfectly use that new method.
[sorry for my awful English]
Mono.

Well, after hours, here is one posible solution:
To make the JSC recognize the modification made on an EJB you should:
- Not undeploy the old EJB, redeploy it instead.
- In the servers tab, refresh the Set of Session EJBs that contains your EJB.
- Drag and drop in the page one of the new methods you added, JSC will create a new EJB client.
- Delete the old EJB Client and change the new one's id to replace it. (Do not touch any of your datasources, because if you do you will loose all your references to the EJB).
- Clean and rebuild your project.
- Done!. You can now use your new methods!
Mono.
[Thx to MAL & JPB]

Similar Messages

  • SNMP implementation with EJB

    Hi,
    Can anyone help me in answering my below points with repect to SNMP and EJB communication arichecture.
    1) I needs to indicate clearly the EJB container containing the Fault Managment application in EJB application.
    2) The relationship of EJB Container and the EJB connecter
    3) The connector of EJB and its relationship to SNMP manager APIs
    4) The Manager APIs to SNMP agent.
    Then it should clearly say the scaling by saying that Fault Management application deployment on multiple servers the how the EJB container to SNMP agent are affected
    Please reply to these queries as soon as possible
    Thanks,

    Hi,
    About the develop question please post to the MSDN forum.
    MSDN forum Developer Network
    http://social.msdn.microsoft.com/Forums/en-US/home?forum=WAVirtualMachinesVirtualNetwork&filter=alltypes&sort=lastpostdesc
    Thanks for your understanding and support.
    We
    are trying to better understand customer views on social support experience, so your participation in this
    interview project would be greatly appreciated if you have time.
    Thanks for helping make community forums a great place.

  • How are JNDI and JDBC related or implemented using EJB's

    For instance if I create an Entity bean, how do I get access to the database?
    Do I create some sort of connection method?
    Is JNDI used to lookup the beans and JDBC separate from that only to connect to the database?
    I am a little confused.
    Thanks.

    Hello,
    With respect to entity bean you need a Datasource for obtaining a sql connection to database. After obtaining a connection to database you can persist your entity bean's state to database.
    Once you create a datasource, you have to bind it to a JNDI name. This JNDI name can then be used to lookup datasource, just like you use telephone directory to obtain a person's telephone no if you have his address.
    You also bind your enity bean to a unique JNDI name so that clients can lookup the bean and use services offered by it.
    JNDI is used to lookup EJBs, datasources, JMS Connection factories, etc and JDBC is used so that you can persist your enterprise java bean's state to database.
    HTH
    VJ

  • Is there a possibility to implement a Portal Services by EJB Bean?

    Let suppose we have a Portal Service class ITestPortalService and EJB called TestEJB
    Can we do this in this way or any other way?
    public class TestBean implements javax.ejb.SessionBean, TestPortalService

    Question: Is there a possibility to implement a Portal Services by EJB Bean?
    I don't think you can do this directly as the portal service is maintained and called from the irj (portal) application, while the EJB beans are called directly from the web application server (as far as I know).
    The only think you could do is to have the Portal Service be  a bridge, which basically only calls the EJB and returns the results.

  • EJB 3.0 and JAX-RPC 1.1 Not Working Together

    I've came across a strange behavior when building a JAX-RPC 1.1 service in WebLogic 10 on top of a EJB 3.0 bean:
    Business Interface
    @Remote
    @WebService(targetNamespace="http://coronelado.sf.net")
    public interface AuthenticationBO {
      boolean login(String email, String password) throws AuthenticationBOException;
    Bean
    @Stateless(name="AuthenticationBO")
    @TransactionManagement(BEAN)
    @WLHttpTransport(contextPath="coronelado-service", serviceUri="AuthenticationBOService")
    @WebService(endpointInterface="net.sf.coronelado.business.AuthenticationBO")
    public class AuthenticationBOBean implements AuthenticationBO {
    ejb-jar.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0">
      <enterprise-beans>
        <session>
          <ejb-name>AuthenticationBO</ejb-name>
          <service-endpoint>net.sf.coronelado.business.AuthenticationBO</service-endpoint>
        </session>
      </enterprise-beans>
    </ejb-jar>After I deploy the bean, two web services, not one, are listed in the console: AuthenticationBOService and AuthenticationBOBeanService (a duplicate), and the following error message is printed:
    [JAM] Warning: failed to resolve class net.sf.coronelado.business.AuthenticationBOBeanAm I missing something here?

    http://fernandoribeiro.eti.br/2007/06/27/bug-in-weblogic-10-web-services/

  • EJB 3.0: java.io.IOException: Unable to find session object ...

    Hello,
    We have an EJB3 application deployed to an Oracle AS 10.1.3.1.0 instance.
    Our main point of entry to the application is a stateful session bean (that controls access), that has injected several other stateful session beans.
    Like this:
    +@Stateful(name = "TstreamUserSession")+
    +public class TstreamUserSessionBean extends UserSessionBean implements TstreamUserSession {+
    +@EJB(name = "ContactSession")+
    private ContactSessionLocal contactSession;
    +@EJB(name = "GuestSession")+
    private GuestSessionLocal guestSession;
    +@EJB(name = "TechCustomerSession")+
    private TechCustomerSessionLocal techCustomerSession;
    +@EJB(name = "PmSession")+
    private PmSessionLocal pmSession;
    +@EJB(name = "CustomerSession")+
    private CustomerSessionLocal customerSession;
    +@EJB(name = "PartnerSession")+
    private PartnerSessionLocal partnerSession;
    +@EJB(name = "AdminSession")+
    private AdminSessionLocal adminSession;
    +@EJB(name = "SuperAdminSession")+
    private SuperAdminSessionLocal superAdminSession;
    +@EJB(name = "VmSession")+
    private VmSessionLocal vmSession;
    +public TstreamUserSessionBean() {+
    +}+
    +...+
    In this class, we also look up these sessions, because we need several instances of these, in this manner:
    +private synchronized Object getSessionInstance(String sessionName) throws AccessDeniedException {+
              +try {+
                   InitialContext ic = new InitialContext();
                   return ic.lookup("java:comp/env/" sessionName);+
              +} catch (NamingException e) {+
              +}+
         +}+
    However, we keep getting the following messages after a certain period.
    java.io.IOException: Unable to find session object 2816103596632839360 for location 'AdminSession'
    +10/01/12 11:50:04 at com.evermind.server.ejb.EJBInternalInputStream.resolveObject(EJBInternalInputStream.java:70)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.checkResolve(ObjectInputStream.java:1346)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBObject.activateBean(StatefulSessionEJBObject.java:581)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBObject.remove_X(StatefulSessionEJBObject.java:213)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBObject.remove_X(StatefulSessionEJBObject.java:159)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBHome.processTimedOutSessions(StatefulSessionEJBHome.java:371)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBHome.cleanUpMaintenance(StatefulSessionEJBHome.java:306)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.EJBTask.run(EJBTask.java:47)+
    +10/01/12 11:50:04 at com.evermind.util.Task.schedule(Task.java:51)+
    +10/01/12 11:50:04 at com.evermind.util.TaskManager.run(TaskManager.java:221)+
    +10/01/12 11:50:04 at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:298)+
    +10/01/12 11:50:04 at java.lang.Thread.run(Thread.java:595)+
    I guess this occurs when the stateful session TstreamUserSession is reactivated?
    Or when the ones being injected are passivated?
    Any idea why this occurs, or how to suppress it, because it really spams our logs...
    Thanks.

    Hello,
    We have an EJB3 application deployed to an Oracle AS 10.1.3.1.0 instance.
    Our main point of entry to the application is a stateful session bean (that controls access), that has injected several other stateful session beans.
    Like this:
    +@Stateful(name = "TstreamUserSession")+
    +public class TstreamUserSessionBean extends UserSessionBean implements TstreamUserSession {+
    +@EJB(name = "ContactSession")+
    private ContactSessionLocal contactSession;
    +@EJB(name = "GuestSession")+
    private GuestSessionLocal guestSession;
    +@EJB(name = "TechCustomerSession")+
    private TechCustomerSessionLocal techCustomerSession;
    +@EJB(name = "PmSession")+
    private PmSessionLocal pmSession;
    +@EJB(name = "CustomerSession")+
    private CustomerSessionLocal customerSession;
    +@EJB(name = "PartnerSession")+
    private PartnerSessionLocal partnerSession;
    +@EJB(name = "AdminSession")+
    private AdminSessionLocal adminSession;
    +@EJB(name = "SuperAdminSession")+
    private SuperAdminSessionLocal superAdminSession;
    +@EJB(name = "VmSession")+
    private VmSessionLocal vmSession;
    +public TstreamUserSessionBean() {+
    +}+
    +...+
    In this class, we also look up these sessions, because we need several instances of these, in this manner:
    +private synchronized Object getSessionInstance(String sessionName) throws AccessDeniedException {+
              +try {+
                   InitialContext ic = new InitialContext();
                   return ic.lookup("java:comp/env/" sessionName);+
              +} catch (NamingException e) {+
              +}+
         +}+
    However, we keep getting the following messages after a certain period.
    java.io.IOException: Unable to find session object 2816103596632839360 for location 'AdminSession'
    +10/01/12 11:50:04 at com.evermind.server.ejb.EJBInternalInputStream.resolveObject(EJBInternalInputStream.java:70)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.checkResolve(ObjectInputStream.java:1346)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)+
    +10/01/12 11:50:04 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBObject.activateBean(StatefulSessionEJBObject.java:581)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBObject.remove_X(StatefulSessionEJBObject.java:213)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBObject.remove_X(StatefulSessionEJBObject.java:159)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBHome.processTimedOutSessions(StatefulSessionEJBHome.java:371)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.StatefulSessionEJBHome.cleanUpMaintenance(StatefulSessionEJBHome.java:306)+
    +10/01/12 11:50:04 at com.evermind.server.ejb.EJBTask.run(EJBTask.java:47)+
    +10/01/12 11:50:04 at com.evermind.util.Task.schedule(Task.java:51)+
    +10/01/12 11:50:04 at com.evermind.util.TaskManager.run(TaskManager.java:221)+
    +10/01/12 11:50:04 at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:298)+
    +10/01/12 11:50:04 at java.lang.Thread.run(Thread.java:595)+
    I guess this occurs when the stateful session TstreamUserSession is reactivated?
    Or when the ones being injected are passivated?
    Any idea why this occurs, or how to suppress it, because it really spams our logs...
    Thanks.

  • Client remote Authentication using JAAS and EJB Access

    Hi,
    I have a problem using JAAS in combination with Sun One Appserver 8.1 and a java remote client trying to access an EJB. Here is the scenario:
    I have implemented an EJB who's methods are protected through the deployment descriptor:
            <assembly-descriptor>
                 <security-role>
                    <description>role for clients outside of the server </description>
                    <role-name>sedna</role-name>
                  </security-role>
                <method-permission>
                  <role-name>sedna</role-name>
                  <method>
                    <ejb-name>ServerInfoBean</ejb-name>
                    <method-intf>Remote</method-intf>
                    <method-name>*</method-name>
                  </method>
                </method-permission>
                <method-permission>
                  <unchecked/>
                  <method>
                    <ejb-name>ServerInfoBean</ejb-name>
                    <method-name>getVersion</method-name>
                  </method>
                  <method>
                    <ejb-name>ServerInfoBean</ejb-name>
                    <method-name>create</method-name>
                  </method>
                </method-permission>
            </assembly-descriptor>I've deployed the EJB in a jar file which was packed into an ear file of a bigger application. The role has been mapped to the admin Principal in the sun-ejb-jar.xml descriptor.
    I can find the EJB, create it, and call the unchecked method getVersion and that works fine, so far so good.
    But then I try to access another method which is protected and then I get this exception
    org.omg.CORBA.NO_PERMISSION:   vmcid: 0x2000  minor code: 1806 completed: Maybe
            at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:179)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:853)
            at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:137)
    ...I have to mention that I do make a login via the LoginContext. My jaas.config File has a reference to the com.sun.enterprise.security.auth.login.ClientPasswordLoginModule module.
    After login (which works perfectly) I lookup the context with a corbaname url which - if I understood it right - ignores the Context.SECURITY_PRINCIPAL and Context.SECURITY_CREDENTIALS settings.
    After that I make the calls to the EJB. And I am allways ANONYMOUS on the server side, which is definitely the problem. Because ANONYMOUS is not allowed to call the protected EJB Methods. But I made a jaas login in advance. So where am I making a mistake???
    Am I doing something wrong?
    Need help! Thx,
    Stephan

    Hi.
    I understand correctly that you call Subject.doAs on
    the client to call the remote EJB. I guess It isn't
    right way.I had also a bad feeling about this, so I forget it. But anyway it wasn't working with or without using that doAs().
    >
    >
    Subject contextSubject =
    Subject.getSubject(AccessController.getContext());
    contextSubject.getPrincipals();This code throws exceptions in the Appserver. Unfortunately they are catched somewhere so I'm unable to find out what was going wrong. But I guess, that these exceptions where security exceptions. Never the less thanks for the hint!
    But I don't think that doing the check on the server side is the way I want to go because that is programmatically security and I want to use the declarative security which can be used through the deployment descriptor. If used correctly - and supposed I do not completely misunderstand the specification - then it should be possible to create an EJB that is protected via it's deployment descriptor and access it through the client only if the client has been authenticated through JAAS mechanisms. After successful authentication the principal should be accessible through the EJB context but not for security check, that should allready been done at this time.
    Unfortunately I don't find any resource on the internet describing the scenario in such a detail that I can reproduce it. There are only very high level documentations and hints in forums.
    Again, thanks for your effort,
    Stephan

  • Who can explain how EJB connect to Oracle9i DB with DataSource?

    I have taken 4 days into this problem. I am developing EJB with J2EE1.3 and Oracle9i DB, I can connect to DB in code with DriverManager. But I want to use DataSource to connect to DB. I failed, I can not get new way to resolve it when I after try to connect with javax.sql.DataSource, oracle.jdbc.pool.OracleDataSource and oracle.jdbc.pool.OracleConnectionPoolDataSource.
    I have got different Exceptions when I coding different ways:
    one is:
    Caught an exception.
    java.rmi.ServerException: RemoteException occurred in server thread; nested exce
    ption is:
    java.rmi.RemoteException: nested exception is: javax.ejb.EJBException: U
    nable to connect to database. com.sun.enterprise.resource.JdbcDataSource; nested
    exception is:
    javax.ejb.EJBException: Unable to connect to database. com.sun.enterpris
    e.resource.JdbcDataSource
    java.rmi.RemoteException: nested exception is: javax.ejb.EJBException: Unable to
    connect to database. com.sun.enterprise.resource.JdbcDataSource; nested excepti
    on is:
    javax.ejb.EJBException: Unable to connect to database. com.sun.enterpris
    e.resource.JdbcDataSource
    javax.ejb.EJBException: Unable to connect to database. com.sun.enterprise.resour
    ce.JdbcDataSource
    <<no stack trace available>>
    the Other is:
    Caught an exception.
    java.rmi.ServerException: RemoteException occurred in server thread; nested exce
    ption is:
    java.rmi.RemoteException: nested exception is: javax.ejb.EJBException: U
    nable to connect to database. makeConnection:Io Exception: Connection refused(DESCRIP
    TION=(TMP=)(VSNNUM=150999297)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)
    ))); nested exception is:
    javax.ejb.EJBException: Unable to connect to database. makeConnection:Io
    Exception: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=12505)(ERROR_
    STACK=(ERROR=(CODE=12505)(EMFI=4))))
    java.rmi.RemoteException: nested exception is: javax.ejb.EJBException: Unable to
    connect to database. makeConnection:Io Exception: Connection refused(DESCRIPTION=(TM
    P=)(VSNNUM=150999297)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))); nes
    ted exception is:
    javax.ejb.EJBException: Unable to connect to database. makeConnection:Io
    Exception: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=12505)(ERROR_
    STACK=(ERROR=(CODE=12505)(EMFI=4))))
    javax.ejb.EJBException: Unable to connect to database. makeConnection:Io Exception: C
    onnection refused(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=12505)(ERROR_STACK=(E
    RROR=(CODE=12505)(EMFI=4))))
    <<no stack trace available>>
    My codes related are:
    private void makeConnection() throws NamingException, SQLException {
    try{
    InitialContext ic = new InitialContext();
    OracleConnectionPoolDataSource ocpds = (OracleConnectionPoolDataSource) ic.lookup(dbName);
    PooledConnection pc = ocpds.getPooledConnection();
    con = pc.getConnection();
    }catch(SQLException ex){
    throw new SQLException("makeConnection:" + ex.getMessage());
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
    con = DriverManager.getConnection(
    "jdbc:oracle:thin:@172.28.200.43:1521:shcd",
    "lijun", "xiaotian"); */
    public void setEntityContext(EntityContext context) {
    this.context = context;
    try {
    makeConnection();
    } catch (Exception ex) {
    throw new EJBException("Unable to connect to database. " +
    ex.getMessage());
    I believe I set JNDI and config EJB right, because I can run it with Cloudscape DB all right.
    who can tell me where is my WRONG, or tell me how to connect to Oracle9i DB?

    Hi Jhlijun,
    I am facing the same problem at the moment. However, I am not using a pooled connection. The following is my code. I am trying to connect a stateless session bean to an Oracle 9i database with result being fed back to a jsp page.
    package Test;
    import javax.naming.*;
    import java.sql.*;
    import java.util.*;
    import javax.ejb.*;
    import javax.sql.DataSource;
    import javax.sql.*;
    public class TestSessionEJBbean extends java.lang.Object implements javax.ejb.SessionBean
    String q="Select NAMETITLE,NAMEFIRST,NAMELAST from People where PeopleRSN<100";
         protected boolean create() throws java.lang.Exception
    return true;
    public TestSessionEJBbean()
    {   // EJB constructors don't have a server context.
    private void unhandledEvent( String listenerName, String methodName, java.lang.Object event )
    // method for interface javax.ejb.SessionBean
    public void ejbActivate() throws javax.ejb.EJBException, java.rmi.RemoteException
    // To Do
    // method for interface javax.ejb.SessionBean
    public void ejbPassivate() throws javax.ejb.EJBException, java.rmi.RemoteException
    // To Do
    // method for interface javax.ejb.SessionBean
    public void ejbRemove() throws javax.ejb.EJBException, java.rmi.RemoteException
    // To Do
    // method for interface javax.ejb.SessionBean
    public void setSessionContext( javax.ejb.SessionContext parm0 ) throws javax.ejb.EJBException, java.rmi.RemoteException
    this._sessionContext = parm0;          // generated helper code
    // To Do
    * Test Method
    public String Test() throws javax.ejb.EJBException
    return "Hi! I am the SessionEjbBean.";
    * Session Context of this EJB.
    * Set in 'setSessionContext()' before any 'ejbCreate()' is executed.
    private javax.ejb.SessionContext _sessionContext;
    * ejbCreate Method
    public void ejbCreate() throws javax.ejb.EJBException, javax.ejb.CreateException
    try {
    create(); // This 'create()' is used for internal initialization.
    catch( java.lang.Exception __e) {
    System.err.println( __e.toString() + " " + __e.getMessage() );
    // TODO: implement
    * getDBConnection Method
         public sun.jdbc.rowset.CachedRowSet getDBConnection() throws javax.ejb.EJBException
         String testPrint = "Starting...";//Only to check output
         Connection conn;
         sun.jdbc.rowset.CachedRowSet crset=null;
         try {
              testPrint += "before new InitialContext()....";//Only to check output
              InitialContext ic = new InitialContext();
              DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/coquit");
              testPrint += "before ds.getConnection()....";//Only to check output
              conn = ds.getConnection("coquit","coquit");          
                   testPrint += "before conn.createStatement()....";
                   Statement stmt=conn.createStatement();
                   testPrint += "before stmt.executeQuery(....)";
                   ResultSet rset = stmt.executeQuery(q);
                   testPrint += "before new sun.jdbc.rowset.CachedRowSet()";     
                   crset = new sun.jdbc.rowset.CachedRowSet();
                   testPrint += "before crset.populate(rset)";
                   crset.populate(rset);
                   rset.close();
                   stmt.close();
                   conn.close();
         } catch (NamingException ne) {
         System.out.println("TestSessionEJBbean::getDBConnection Naming Exception " + ne);
         }catch (Exception e){
         System.out.println(testPrint+"...TestSessionEJBbean::getDBConnectionException" + e);
         System.out.println("\n\n");
         e.printStackTrace();
         return crset;

  • How am I able to use an injected EJB in a Managed Bean Constructor?

    JSF 1.2
    EJB 3.0
    Glassfish v1
    Summary:
    Managed bean injected EJB is null when referencing EJB var in constructor.
    Details:
    In my managed bean, I have a constructor that tries to reference an injected EJB, such as:
    public class CustomerBean implements Serializable {
    @EJB private CustomerSessionRemote customerSessionRemote;
    public CustomerBean() {
    List<CustomerRow> results = customerSessionRemote.getCustomerList();
    }The call within the constructor to customerSessionRemote is null - I've double checked this in Netbeans 5.5.
    How am I able to use an injected EJB in a Managed Bean Constructor?
    Thanks,
    --Todd                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

    OK, I was reading the article Web Tier to Go With Java EE 5: A Look at Resource Injection and I understand your statement too.
    Is there any way possible to Inject the EJB prior to the bean instance creation at all?
    Maybe, I need to approach it with the old fashion Java EE 1.4 route and using JNDI in the PostConstruct annotated method to reference the EJB in the managed bean.
    This had to been thought out before, I don't understand why a manged bean's life cycle places any injections at the end of the bean creation.
    Also, now that I understand that the @PostConstruct annotated method will be called by the container after the bean has been constructed and before any business methods of the bean are executed.
    I am trying to reference my EJB as part of the creation of the managed bean.
    What happens: the JSF page loads the managed bean and I need to populate a listbox component with data from an EJB.
    When I try to make the call to the EJB in the listbox setter method, the EJB reference is null.
    Now, I'm not for sure if the @PostConstruct annotation is going to work... hmmmm.
    ** Figured it out. ** I just needed to move the EJB logic that was still in the setter of the component I wanted to populate into the annotated PostConstruct method.

  • Using JPA Entity-Objects defined in other EJB-Development Component

    Hello Community,
    I'm working on a Java-Application on NW CE 7.1, using JEE5 Beans in the Business-Logic-Layer and WebDynpro/Java in the UI-Layer.
    I designed a Bean for working with data, stored in a database-table of the system-database.
    For that addtionally i created a class, representing the Entity-Object, in the same Development-Component of Type EJB 3.0.
    It looks like this:
    @NamedQueries ({
         @NamedQuery (name="findAllSdCust", query="SELECT c from SdCust c ORDER BY c.kdnr"),
         @NamedQuery (name="findSdCustByKdnr", query="SELECT c from SdCust c WHERE c.kdnr = :kdnr"),
         @NamedQuery (name="findSdCustByIlnnr", query="SELECT c from SdCust c WHERE c.ilnnr = :ilnnr")
    @Entity
    @Table(name="ZKALL_SD_CUST")
    public class SdCust implements Serializable {
         @Id
         @TableGenerator (name="idGenerator", table="ZKALL_ID_GEN", pkColumnName="GEN_KEY", valueColumnName="GEN_VALUE", initialValue=100)
         @GeneratedValue (strategy=GenerationType.TABLE, generator="idGenerator")
         private long id;
         private String name;
         private String lname;
         private String kdnr;
         private String ilnnr;
         private long connid;
         private long cnt;
         @Version
         private long version;
          Constructor, Getter and Setter methods follow here
    The corresponding bean looks like this
    @Stateless(name="SdCustBean")
    public class SdCustBean implements SdCustLocal {
         @PersistenceContext (unitName="xyz")
         private EntityManager em;
         public SdCust getSdCustByKdnr (String kdnr)
              SdCust result = new SdCust();
              // List<Manufacturer> resultList = new ArrayList<Manufacturer>();
              Query  myQuery = em.createNamedQuery("findSdCustByKdnr");
              myQuery.setParameter("kdnr", kdnr);
              result = (SdCust) myQuery.getSingleResult();
              return result;
         public void setEM (EntityManager iem)
              em = iem;
           // other methods .....
    After that i created a new Development-Component of Enterprise Application-Type and added above DC to this EAR-DC. I also supplied the nessecary descriptor-files/Enries in EJB-DC and EAR-DC.
    When now using this bean from WebDynpro with the Web-Dypro EJB-Model-Import everything works fine.
    The bean returns the desired object(s).
    But now i created a new DC of type EBJ 3.0
    This DC contains a Message Driven Bean. That MDB is a Job-Bean which i want to schedule. That  Bean uses JRA to connect to an SAP-Abap-System to read some Data and should use JPA to insert/upate/delete the read data in the Database. This should work as a simple replication for my application.
    I assigned that EJB-DC containing the MDB to a new EAR-DC together with job-definition-xml and the neccessary entries in deployment-descriptors.
    After deploying i see the corresponding job-defition in the NW scheduler using the administrator-views.
    I'm also able to schedule the job and it executes fine. Connecting to SAP-Abap System also works fine using JRA.
    But JPA does not work!!!!!
    I created an dependency from my EAR-DC containing the Job EJB-DC and to the EJB-DC containing the Entity-Class.
    I tried three diferent things to get i running, but all of them failed.
    1.)
    The part  looks like:
    public class MasterDataReplicateJobBean extends MDBJobImplementation implements MessageListener
      @EJB SdCustBean mybean;
       public void onJob(JobContext ctx) throws Exception {
            SdCust sdCust = mybean.getSdCustByKdnr (mykdnr);
    Compiles fine. But this fails because the Data is stored in the system-database. The exception says, that i have to use a datasource which supports 2-Phase commit. I know, that i could possibly solve this problem by annotation the Method getSdCustByKdnr with the Annotation for the Transaction-Manager to use REQUIRES_NEW Transaction. But i dont want to generally annotate my methods this way.
    2.)
    This part looks like this
    public class MasterDataReplicateJobBean extends MDBJobImplementation implements MessageListener
    @PersistenceContext (unitName="xyz")
    private EntityManager em;
       public void onJob(JobContext ctx) throws Exception {
         SdCust cust = new SdCust();
         Query  myQuery = em.createQuery("SELECT c from SdCust c WHERE c.kdnr = :kdnr");
         myQuery.setParameter("kdnr", dbkdnr);
         cust = (SdCust) myQuery.getSingleResult();
    This also results in a runtime-exception because the entity-Manager cant resolve SdCust from the Query as an Object. The Exception is:
    java.lang.IllegalArgumentException: line 1: Abstract Schema Type 'SdCust' doesn't exist
    SELECT c from SdCust c WHERE c.kdnr = :kdnr
    3.) and last try so far:
    public class MasterDataReplicateJobBean extends MDBJobImplementation implements MessageListener
    @PersistenceContext (unitName="xyz")
    private EntityManager em;
       public void onJob(JobContext ctx) throws Exception {
         SdCustBean custBean = new SdCustBean();
         custBean.setEM(em);
         SdCust cust = custBean.getSdCustByKdnr(kdnr);
    In this example i use the Bean from the beginning not as a bean itself but as a normal class. that class has an addtional Method setEM to set the Entity-Manager (which is injected when using the class as a bean)
    In that way i got the exception, that the named Query "findSdCustByKdnr" cannot be found by the entity-manager.
    It seems to me, that i can access the class, but that all annotations belonging to JPA for that class are not recognized.
    Does anybody can give me a hint to solve this problem? Did i forgot something important?
    best regards
    matthias hayk
    Edited by: Matthias Hayk on Feb 5, 2009 9:38 AM

    I was already on wright trace.
    My class "SdCust" was not recognized by the Entity-Manager as an Entity-Class.
    This relies on the storage of the entity-class and where the Entity-Manager looks for entity-classes.
    By default it seems to look for all classes in the same jar file. thats the reason why everything works fine when the using bean and the entity-class are in the same project.
    In my last case, the using bean is in another  development-component and so also in anohter jar file. in this case the entity-manager must be told where to find entity-classes.
    this is done in the persistence.xml file.
    i added the line
    <jar-file>xxx.yyy.com~mdata_beans.jar</jar-file>
    underneath the <persistence-unit>-tag.
    This works.
    regards
    Matthias Hayk

  • EJB Primary Key not found in lock manager - Container BUG?

    I have an EJB entity bean whose primary key class implementation is pretty simple, consisting of two strings. For the MOST part, it seems to work properly, but every so often I see the following message in my application server log.
    ####<Sep 17, 2008 10:03:27 AM EDT> <Warning> <JTA> <armantac22> <AdminServer> <[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <> <1221660207187> <BEA-110401> <Ignoring error in afterCompletion. Object=weblogic.ejb.container.internal.TxManager$TxListener@1906466, Exception=javax.ejb.EJBException: [EJB:010108]The EJB Lock Manager has received an unlock request from EJB:PortfolioMetaData with primary key:[ObjectPK: type: PortMetaData name: PortMetaData]. However, this primary key could not be found in the Lock Manager. This indicates either an EJB container bug, or the equals and hashCode methods for the primary key class:com.armanta.ejb.ObjectPK are implemented incorrectly. Please check the equals and hashCode implementations.
    javax.ejb.EJBException: [EJB:010108]The EJB Lock Manager has received an unlock request from EJB:PortfolioMetaData with primary key:[ObjectPK: type: PortMetaData name: PortMetaData]. However, this primary key could not be found in the Lock Manager. This indicates either an EJB container bug, or the equals and hashCode methods for the primary key class:com.armanta.ejb.ObjectPK are implemented incorrectly. Please check the equals and hashCode implementations.
         at weblogic.ejb.container.locks.ExclusiveLockManager$LockBucket.unlock(ExclusiveLockManager.java:409)
         at weblogic.ejb.container.locks.ExclusiveLockManager.unlock(ExclusiveLockManager.java:170)
         at weblogic.ejb.container.manager.ExclusiveEntityManager.afterCompletion(ExclusiveEntityManager.java:723)
         at weblogic.ejb.container.manager.ExclusiveEntityManager.afterCompletion(ExclusiveEntityManager.java:667)
         at weblogic.ejb.container.internal.TxManager$TxListener.afterCompletion(TxManager.java:984)
         at weblogic.transaction.internal.ServerSCInfo.callAfterCompletions(ServerSCInfo.java:862)
         at weblogic.transaction.internal.ServerTransactionImpl.callAfterCompletions(ServerTransactionImpl.java:2913)
         at weblogic.transaction.internal.ServerTransactionImpl.afterCommittedStateHousekeeping(ServerTransactionImpl.java:2806)
         at weblogic.transaction.internal.ServerTransactionImpl.setCommitted(ServerTransactionImpl.java:2851)
         at weblogic.transaction.internal.ServerTransactionImpl.globalRetryCommit(ServerTransactionImpl.java:2650)
         at weblogic.transaction.internal.ServerTransactionImpl.globalCommit(ServerTransactionImpl.java:2570)
         at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:277)
         at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:226)
         at weblogic.ejb.container.internal.BaseEJBHome.postHomeInvoke(BaseEJBHome.java:389)
         at weblogic.ejb.container.internal.EntityEJBHome.findByPrimaryKey(EntityEJBHome.java:408)
         at com.armanta.ejb.portfolio.PortfolioMetaData_a4zvzk_HomeImpl.findByPrimaryKey(PortfolioMetaData_a4zvzk_HomeImpl.java:64)
         at com.armanta.ejb.portfolio.PortfolioMasterBean.getPortfolioMetaData(PortfolioMasterBean.java:313)
         at com.armanta.ejb.portfolio.PortfolioMaster_fmk9e8_EOImpl.getPortfolioMetaData(PortfolioMaster_fmk9e8_EOImpl.java:64)
         at com.armanta.ejb.portfolio.PortfolioMaster_fmk9e8_EOImpl_WLSkel.invoke(Unknown Source)
         at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:517)
         at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:224)
         at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:407)
         at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
         at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:147)
         at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:403)
         at weblogic.rmi.internal.BasicServerRef.access$300(BasicServerRef.java:56)
         at weblogic.rmi.internal.BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:934)
         at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
         at weblogic.work.ExecuteThread.run(ExecuteThread.java:179)
    I checked the equals and hashCode implementations and nothing pops out at me. Once this happens, the EJB seems to get messed up in the database and I lose information!
    Here is the class implementation along with its superclass. I don't see anything blatant. Sorry for the lack of indentation, my original post was indented.
    Thanks
    Eric
    public class ObjectPK extends ArmantaPK {
         private String type;
         private String name;
         private ObjectPK() {
              super();
         public ObjectPK(String type, String name) {
              super();
              this.type = type;
              this.name = name;
         public String getName() {
              return name;
         public String getType() {
              return type;
         public String toString() {
              StringBuffer buffer = new StringBuffer();
              buffer.append("[ObjectPK:");
              buffer.append(" type: ");
              buffer.append(type);
              buffer.append(" name: ");
              buffer.append(name);
              buffer.append("]");
              return buffer.toString();
         * Returns <code>true</code> if this <code>ObjectPK</code> is the same as the o argument.
         * @return <code>true</code> if this <code>ObjectPK</code> is the same as the o argument.
         public boolean equals(Object o) {
              if (this == o) {
                   return true;
              if (!super.equals(o)) {
                   return false;
              if (o == null) {
                   return false;
              if (o.getClass() != getClass()) {
                   return false;
              ObjectPK castedObj = (ObjectPK) o;
              return ((this.type == null ? castedObj.type == null : this.type
                   .equals(castedObj.type)) && (this.name == null
                   ? castedObj.name == null
                   : this.name.equals(castedObj.name)));
         * Override hashCode.
         * @return the Objects hashcode.
         public int hashCode() {
              int hashCode = super.hashCode();
              hashCode = 31 * hashCode + (type == null ? 0 : type.hashCode());
              hashCode = 31 * hashCode + (name == null ? 0 : name.hashCode());
              return hashCode;
         public Object clone() {
              ObjectPK inst = new ObjectPK();
              inst.type = this.type == null ? null : new String(this.type);
              inst.name = this.name == null ? null : new String(this.name);
              return inst;
    public abstract class ArmantaPK implements Serializable, Cloneable, Comparable {
         // Enforce compatability with future versions
         private static final long serialVersionUID = 1980721424128862564L;
         // Cache the hash code
         private transient int hash = 0;
         * Clones a primary key. Note that this is not a deep copy.
         * @return the cloned primary key
         public Object clone() throws CloneNotSupportedException {
              ArmantaPK newKey = (ArmantaPK) super.clone();
              newKey.hash = 0;
              return newKey;
         * Compare the specified object with this key for equality.
         * Implementations should return <tt>true</tt>
         * if and only if the specified object is also a key
         * of the same class and all corresponding attributes in the keys are
         * <i>equal</i>.
         * @param other the object to be compared for equality with this key.
         * @return <tt>true</tt> if the specified object is equal to this key.
         public boolean equals(Object other) {
              return other instanceof ArmantaPK;
         * This implementation only returns an empty String.
         * @return String
         public String toString() {
              return "";
         * Return the hash code value for this key. Implemented to call the
         * key's <code>computeHash</code> method and cache the result for
         * faster operation. Classes extending <code>ArmantaPK</code> should
         * only implement <code>computeHash</code>.
         * @return int
         public int hashCode() {
              if (hash == 0) {
                   hash = computeHash();
              return hash;
         * @y.exclude
         * Compute a hash code for this key. This is the method that should
         * be overridden by sub-classes.
         * @return int
         protected int computeHash() {
              return 0;
         * @y.exclude
         * After called, will force the hash code to get recomputed.
         public void rehash() {
              hash = 0;
         * Compares this <tt>ArmantaPK</tt> to another object by comparing
         * their string representations.
         * @return an integer based upon comparing the <tt>ArmantaPK</tt>s string
         * representations
         public int compareTo(Object o) {
    return toString().compareTo(o.toString());
    }

    We are experiencing a similar error after upgrading 9.2 to 9.2 MP3. We do not want to upgrade to 10g at this time. Is there a patch we can download with the fix?

  • Deployed EJB Not Bound

    I deplyed a simple EJB on S17AS. The server.log tells me it is deployed successful.
    CORE3282: stdout: ejbCreate() on obj samples.jdbc.simple.ejb.GreeterDBBean@1017ca1
    CORE3282: stdout: ejbCreate() on obj samples.jdbc.simple.ejb.GreeterDBBean@9d5793
    LDR5010: All ejb(s) of [simpleEjb] loaded successfully!
    The relevant simpleEjb.jar_verified.txt is as follows
         Test Name : tests.ejb.ias.ASEjbJndiName
         Test Assertion :
         Test Description : PASSED [AS-EJB ejb] : jndi-name is simpleHome
    However, the server log did not indicate the EJB is bound even if I set the log level to finest.
    Therefore when I tried to access it, I get the following error
    Exception in thread "main" javax.naming.NameNotFoundException: No object bound f
    or java:comp/env/ejb/simpleHome
    at com.sun.enterprise.naming.java.javaURLContext.lookup(javaURLContext.j
    ava:116)
    at javax.naming.InitialContext.lookup(InitialContext.java:347)
    at HelloClient.main(HelloClient.java:61)
    The client code is as follows
    String JNDIName = "java:comp/env/ejb/simpleHome";
    myGreeterDBHome = (GreeterDBHome) javax.rmi.PortableRemoteObject.narrow(
                   initContext.lookup(JNDIName), GreeterDBHome.class);
    The sun-ejb-jar.xml is as follows
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Copyright 2002 Sun Microsystems, Inc. All rights reserved.
    -->
    <!DOCTYPE sun-ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7.0 EJB 2.0//EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_0-0.dtd'>
    <sun-ejb-jar>
    <enterprise-beans>
    <name>simpleEjb.jar</name>
    <ejb>
    <ejb-name>simpleEJB</ejb-name>
    <jndi-name>simpleHome</jndi-name>
    <is-read-only-bean>false</is-read-only-bean>
                   <bean-pool>
                        <steady-pool-size>2</steady-pool-size>
                        <resize-quantity>5</resize-quantity>
                        <max-pool-size>20</max-pool-size>
                        <pool-idle-timeout-in-seconds>3600</pool-idle-timeout-in-seconds>
                   </bean-pool>
    </ejb>
    </enterprise-beans>
    </sun-ejb-jar>
    I tried to use lookup for both "java:comp/env/ejb/simpleHome" and "java:comp/env/simpleHome". None succeed.
    Does anyone know why the ejb is deployed successful but not bound?
    Sha

    Hi, Parsuram,
    I did restart the server and the error is the same.
    Here is the sample code. I did not change them. Only the names in deployment descriptors are modified.
    Below is the info.
    *************************Remote Interface
    Copyright � 2002 Sun Microsystems, Inc. All rights reserved.
    package samples.jdbc.simple.ejb;
    * Remote interface for the GreeterDBEJB. The remote interface defines all possible
    * business methods for the bean. These are the methods going to be invoked remotely
    * by the servlets, once they have a reference to the remote interface.
    * Servlets generally take the help of JNDI to lookup the bean's home interface and
    * then use the home interface to obtain references to the bean's remote interface.
    public interface GreeterDB extends javax.ejb.EJBObject {
    * Returns the greeting String such as "Good morning, John"
         * @return the greeting String
    public String getGreeting() throws java.rmi.RemoteException;
    *************************Home Interface
    Copyright � 2002 Sun Microsystems, Inc. All rights reserved.
    package samples.jdbc.simple.ejb;
    * Home interface for the GreeterDB EJB. Clients generally use home interface
    * to obtain references to the bean's remote interface.
    public interface GreeterDBHome extends javax.ejb.EJBHome {
    * Gets a reference to the remote interface to the GreeterDBBean.
         * @exception throws CreateException and RemoteException.
    public GreeterDB create() throws java.rmi.RemoteException, javax.ejb.CreateException;
    *************************Bean Class
    Copyright � 2002 Sun Microsystems, Inc. All rights reserved.
    package samples.jdbc.simple.ejb;
    import java.util.*;
    import java.io.*;
    * A simple stateless session bean which generates the greeting string for jdbc-simple
    * application. This bean implements the business method as declared by the remote interface.
    public class GreeterDBBean implements javax.ejb.SessionBean {
    private javax.ejb.SessionContext m_ctx = null;
    * Sets the session context. Required by EJB spec.
         * @param ctx A SessionContext object.
    public void setSessionContext(javax.ejb.SessionContext ctx) {
    m_ctx = ctx;
    * Creates a bean. Required by EJB spec.
    public void ejbCreate() {
    System.out.println("ejbCreate() on obj " + this);
    * Removes a bean. Required by EJB spec.
    public void ejbRemove() {
    System.out.println("ejbRemove() on obj " + this);
    * Loads the state of the bean from secondary storage. Required by EJB spec.
    public void ejbActivate() {
    System.out.println("ejbActivate() on obj " + this);
    * Keeps the state of the bean to secondary storage. Required by EJB spec.
    public void ejbPassivate() {
    System.out.println("ejbPassivate() on obj " + this);
    * Required by EJB spec.
    public void GreeterDBBean() {
    * Returns the Greeting String based on the time
    * @return the Greeting String.
    public String getGreeting() throws java.rmi.RemoteException {
    System.out.println("GreeterDB EJB is determining message...");
    String message = null;
    Calendar calendar = new GregorianCalendar();
    int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
    if(currentHour < 12) message = "morning";
    else {
    if( (currentHour >= 12) &&
    (calendar.get(Calendar.HOUR_OF_DAY) < 18)) message = "afternoon";
    else message = "evening";
    System.out.println("- Message determined successfully");
    return message;
    ************************ejb-jar.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Copyright 2002 Sun Microsystems, Inc. All rights reserved.
    -->
    <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
    <ejb-jar>
    <enterprise-beans>
    <session>
    <display-name>simple</display-name>
    <ejb-name>simpleEJB</ejb-name>
    <home>samples.jdbc.simple.ejb.GreeterDBHome</home>
    <remote>samples.jdbc.simple.ejb.GreeterDB</remote>
    <ejb-class>samples.jdbc.simple.ejb.GreeterDBBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Bean</transaction-type>
    </session>
    </enterprise-beans>
    </ejb-jar>
    ************************sun-ejb-jar.xml
    <sun-ejb-jar>
    <enterprise-beans>
    <name>simpleEjb.jar</name>
    <ejb>
    <ejb-name>simpleEJB</ejb-name>
    <jndi-name>ejb/simpleHome</jndi-name>
    <is-read-only-bean>false</is-read-only-bean>
                   <bean-pool>
                        <steady-pool-size>2</steady-pool-size>
                        <resize-quantity>5</resize-quantity>
                        <max-pool-size>20</max-pool-size>
                        <pool-idle-timeout-in-seconds>3600</pool-idle-timeout-in-seconds>
                   </bean-pool>
    </ejb>
    </enterprise-beans>
    </sun-ejb-jar>
    ************************Assemble Info
    C:\Sun\AppServer7\samples\jdbc\simple\assemble\jar>jar cvf simpleEjb.jar *
    added manifest
    ignoring entry META-INF/
    adding: META-INF/ejb-jar.xml(in = 710) (out= 350)(deflated 50%)
    adding: META-INF/sun-ejb-jar.xml(in = 803) (out= 424)(deflated 47%)
    adding: samples/(in = 0) (out= 0)(stored 0%)
    adding: samples/jdbc/(in = 0) (out= 0)(stored 0%)
    adding: samples/jdbc/simple/(in = 0) (out= 0)(stored 0%)
    adding: samples/jdbc/simple/ejb/(in = 0) (out= 0)(stored 0%)
    adding: samples/jdbc/simple/ejb/GreeterDB.class(in = 210) (out= 168)(deflated 20%)
    adding: samples/jdbc/simple/ejb/GreeterDBBean.class(in = 1441) (out= 734)(deflated 49%)
    adding: samples/jdbc/simple/ejb/GreeterDBHome.class(in = 257) (out= 177)(deflated 31%)
    C:\Sun\AppServer7\samples\jdbc\simple\assemble\jar>jar tf simpleEJB.jar
    META-INF/
    META-INF/MANIFEST.MF
    META-INF/ejb-jar.xml
    META-INF/sun-ejb-jar.xml
    samples/
    samples/jdbc/
    samples/jdbc/simple/
    samples/jdbc/simple/ejb/
    samples/jdbc/simple/ejb/GreeterDB.class
    samples/jdbc/simple/ejb/GreeterDBBean.class
    samples/jdbc/simple/ejb/GreeterDBHome.class
    ******************************** Deployment Info
    server1: Applications: EJB Modules: simpleEjb
    EJB Module Name: simpleEjb
    Location: C:\Sun\AppServer7\domains\domain1\server1\applications\j2ee-modules\simpleEjb_1
    ******************************** simplEJB.jar_verified.txt
    STATIC VERIFICATION RESULTS
         NUMBER OF FAILURES/WARNINGS/ERRORS
         # of Failures : 0
    # of Warnings : 1
         # of Errors : 0
         Test Name : tests.ejb.ias.ASEjbJndiName
         Test Assertion :
         Test Description : PASSED [AS-EJB ejb] : jndi-name is ejb/simpleHome
         WARNINGS :
         Test Name : tests.ejb.businessmethod.BusinessMethodException
         Test Assertion : Enterprise bean business method throws RemoteException test
         Test Description : For [ module_simpleEjb#simpleEjb#simpleEJB ]
    For EJB Class [ samples.jdbc.simple.ejb.GreeterDBBean ] business method [ getGreeting ]
    Error: Compatibility Note: A public business method [ getGreeting ] was found, but EJB 1.0 allowed the business methods to throw the java.rmi.RemoteException to indicate a non-application exception. This practice is deprecated in EJB 1.1 ---an EJB 1.1 compliant enterprise bean should throw the javax.ejb.EJBException or another RuntimeException to indicate non-application exceptions to the Container.
    *********************** server log (no binding info)
    [05/Jan/2003:17:07:19] FINE ( 1760): [EJBClassPathUtils] EJB Class Path for [simpleEjb] is ...
    [C:\Sun\AppServer7\domains\domain1\server1\applications\j2ee-modules\simpleEjb_1, C:\Sun\AppServer7\domains\domain1\server1\generated\ejb\j2ee-modules\simpleEjb]
    [05/Jan/2003:17:07:20] FINE ( 1760): Loading StatelessSessionContainer...
    [05/Jan/2003:17:07:20] FINE ( 1760): [BaseContainer] Registered EJB [simpleEJB] with MBeanServer under name [ias:instance-name=server1,mclass=stateless-session-bean,name=simpleEJB,root=root,standalone-ejb-module=simpleEjb,type=monitor]
    [05/Jan/2003:17:07:20] FINE ( 1760): main: name = "samples.jdbc.simple.ejb._GreeterDBBean_RemoteHomeImpl_Tie", codebase = ""
    [05/Jan/2003:17:07:20] FINE ( 1760): main: name = "samples.jdbc.simple.ejb._GreeterDBHome_Stub", codebase = ""
    [05/Jan/2003:17:07:20] FINE ( 1760): main: name = "samples.jdbc.simple.ejb._GreeterDBHome_Stub", codebase = ""
    [05/Jan/2003:17:07:20] FINE ( 1760): main: name = "samples.jdbc.simple.ejb._GreeterDBBean_EJBObjectImpl_Tie", codebase = ""
    [05/Jan/2003:17:07:20] FINE ( 1760): main: name = "samples.jdbc.simple.ejb._GreeterDB_Stub", codebase = ""
    [05/Jan/2003:17:07:20] FINE ( 1760): [Pool-ejb/simpleHome]: Added PoolResizeTimerTask...
    [05/Jan/2003:17:07:20] FINE ( 1760): Created container with uinque id: 68275827784351744
    [05/Jan/2003:17:07:20] FINE ( 1760): Application deployment successful : com.sun.ejb.containers.StatelessSessionContainer@1083717
    [05/Jan/2003:17:07:20] INFO ( 1760): LDR5010: All ejb(s) of [simpleEjb] loaded successfully!
    [05/Jan/2003:17:07:22] FINE ( 1760): Started 48 request processing threads
    [05/Jan/2003:17:07:22] INFO ( 1760): CORE3274: successful server startup
    [05/Jan/2003:17:07:22] FINE ( 1760): The server is now ready to process requests
    [05/Jan/2003:17:07:22] INFO ( 1760): CORE3282: stdout: ejbCreate() on obj samples.jdbc.simple.ejb.GreeterDBBean@10613aa
    [05/Jan/2003:17:07:22] INFO ( 1760): CORE3282: stdout: ejbCreate() on obj samples.jdbc.simple.ejb.GreeterDBBean@1f52460
    [05/Jan/2003:17:07:22] INFO ( 1760): CORE5053: Application onReady complete.
    *********************** Client class
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import java.util.Properties;
    import java.util.Hashtable;
    import javax.ejb.*;
    import java.sql.*;
    import javax.sql.*;
    import samples.jdbc.simple.ejb.*;
    public class HelloClient {
         public static void main(String[] args) throws Exception {
    javax.ejb.Handle beanHandle;
    GreeterDBHome myGreeterDBHome;
    GreeterDB myGreeterDBRemote;
    InitialContext initContext = null;
    Hashtable env = new java.util.Hashtable(1);
    initContext = getContextInfo();
    String JNDIName = "java:comp/env/ejb/simpleHome";
    System.out.println("- Looking up: " + JNDIName);
    myGreeterDBHome = (GreeterDBHome) javax.rmi.PortableRemoteObject.narrow(initContext.lookup(JNDIName), GreeterDBHome.class);
    myGreeterDBRemote = myGreeterDBHome.create();
              String theMessage = myGreeterDBRemote.getGreeting();
    myGreeterDBRemote.remove();
         public static InitialContext getContextInfo() {
         InitialContext ctx = null;
         String url = "iiop://1st:3700";
         String fac = "com.sun.enterprise.naming.SerialInitContextFactory";
    try {
         Properties props = new Properties();
         props.put(Context.INITIAL_CONTEXT_FACTORY, fac);
         props.put(Context.PROVIDER_URL, url);
              ctx = new InitialContext(props);
         catch (NamingException ne){
    System.out.println("We were unable to get a connection to " +
    " the application server at " + url);
    ne.printStackTrace();
    return ctx;
    *********************** Running Client from command line
    C:\Sun\AppServer7\samples\jdbc\simple\assemble\jar>java HelloClient
    - Looking up: java:comp/env/ejb/simpleHome
    Exception in thread "main" javax.naming.NameNotFoundException: No object bound for java:comp/env/ejb/simpleHome
    at com.sun.enterprise.naming.java.javaURLContext.lookup(javaURLContext.java:116)
    at javax.naming.InitialContext.lookup(InitialContext.java:347)
    at HelloClient.main(HelloClient.java:34)

  • JSF 2.0 ejb dependency injection

    It seams that @EJB annotation does not work everywhere... at least in my case.
    Use case:EAR app
    EJB:based on JavaDB APP schema (jdbc/sample in GFv3)(entities, JPA controllers as session beans)
    WAR:JSF 2.0 app using EJB
    For instance in a converter:
    @FacesConverter(forClass=ro.x64.entity.DiscountCode.class)
    public class DiscountCodeConverter implements Converter {
        @EJB
        DiscountCodeFacade discountCodeFacade;
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            Character id = new Character(value.charAt(0));
            return discountCodeFacade.find(id);
        public String getAsString(FacesContext context, UIComponent component, Object value) {
            if (value == null) {
                return null;
            if (value instanceof DiscountCode) {
                DiscountCode o = (DiscountCode) value;
                return o.getDiscountCode() == null ? "" : o.getDiscountCode().toString();
            } else {
                throw new IllegalArgumentException("object " + value + " is of type " + value.getClass().getName() + "; expected type: jpa.entities.DiscountCode");
    } discountCodeFacade is resolved to null.
    ...but same @EJB works in a managed bean.
    So is my code wrong,do I use @EJB improperly or is this a bug?
    Florin POP
    Thank you for your replies

    I even tried to decorate as a CDI Managed Bean my @FacesConverter.
    @Named
    @RequestScoped
    @FacesConverter(forClass=MyClass.class)
    public class MyConverter implements ConverterBut didn't work either. When my application is deployed I can see that my class is managed but injection is not working.
    INFO: Adapting InjectionTarget for org.test.MyConverter in the scope interface javax.enterprise.context.RequestScoped
    A workaround is making a context lookup in your converter constructor:
    MyEJB bean;
    public MyConverter() {
                try {
                    bean = (MyEJB) InitialContext.doLookup("java:global/MyApp/MyEJB");
                } catch (NamingException ex) {
                    Logger.getLogger("Converter").log(Level.SEVERE, null, ex);
        }Hope it helps

  • JSF combined with EJB, how??

    Hi @ll,
    I have been trying for some days to combine my JSF pages with EJB Session Beans, but I haven't really found a working way to do it.
    First, I had my session bean directly as the backing bean for the JSF page, but I read somewhere that this isn't "allowed", so I created a helper bean as managed bean. This is now the backing bean for the jsf page and has as attribute the session bean.
    My helper bean:
    public class ManagedHelperBean {
    @EJB private JDDACReaderBeanRemote reader;
    public JDDACReaderBeanRemote getReader() {
         return reader;
    public void setReader(JDDACReaderBeanRemote reader) {
         this.reader = reader;
    }Part of my faces-config.xml
    <managed-bean>
    <managed-bean-name>helper</managed-bean-name>
    <managed-bean-class>com.company.ManagedHelperBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>Part of my jsp page:
    <h:outputText value="#{helper}"/>
    <h:outputText value="#{helper.reader}"/>Now, the first output in the jsp page works, the second one doesn't. Why can't the property reader be accessed?? What is the correct way to combine JSF with EJB?
    Kind regards,
    Wiebke

    Hello,
    I faced the same problem, but on a Weblogic 10 server.
    The problem with Weblogic 10 is, even if it's "supposed" to be a EE5 compliant server, it is not.
    As described here http://e-docs.bea.com/wls/docs100/webapp/annotateservlet.html , there is no Dependency Injection in JSF managed beans:
    The web container will not process annotations on classes like Java Beans and other helper classes.
    But, WL 10 offers DI on Servlets, Filters and Listeners.
    Here is how I solved it (probably not the best way, but it works for me):
    - created a filter with a list of EJB injected (as it works). For every filtered request, set a list of known (enum) as request attributes mapped each to a EJB service:
    public class EJBInjectFilter implements Filter {
    @EJB
    private MyEJBService ejbRef;
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
                   ServletException {
    log.debug("Setting EJB ref into request as attribute ");
              req.setAttribute(ServiceEnum.MY_EJB_SERVICE.toString(), ejbRef);
              chain.doFilter(req, resp);     
    - for every managed bean who needs a service you can do something like:
    (MyEJBService) ((HttpServletRequest) FacesContext.getCurrentInstance().
                   getExternalContext().getRequest()).getAttribute(ServiceEnum.MY_EJB_SERVICE.toString())
    to get a reference to service.
    I agree it is a totally not elegant solution. But why does WL 10 say it's a full JEE5 compliant server, and though does not provide DI for managed beans?
    A drawbacks I could think of is performance slow-down (for every request, apply filter, set list of attributes + references into request) - probably it does take some time.
    Let me know your thoughts.
    Edited by: cosminj on Nov 20, 2007 8:16 AM

  • BMP question : got javax.ejb.EJBException error Object state not saved

    Could anybody please help me? I could not figure out what i did wrong.
    I got the javax.ejb.EJBException error: Object state not saved
    when i test the getname() method for findByPrimaryKey() and findAll() methods.
    Here is my code:
    package org.school.idxc;
    import javax.sql.*;
    import javax.naming.*;
    import javax.ejb.*;
    import javax.sql.*;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Enumeration;
    import java.util.Vector;
    * Bean implementation class for Enterprise Bean: status
    public class statusBean implements javax.ejb.EntityBean {
         private javax.ejb.EntityContext myEntityCtx;
         private int id;
         private String name;
         private DataSource ds;
         private String dbname = "jdbc/idxc";
         private Connection con;
         * ejbActivate
    public void ejbActivate() {
         * ejbLoad
         public void ejbLoad() {
         System.out.println("Entering EJBLoad");
         try
         Integer primaryKey = (Integer) myEntityCtx.getPrimaryKey();
         String sqlstmt = "select id, name from from status where id =?";
         con = ds.getConnection();
         PreparedStatement stmt = con.prepareStatement(sqlstmt);
         stmt.setInt (1,primaryKey.intValue());
         ResultSet rs = stmt.executeQuery();
         if (rs.next())
              this.id = rs.getInt(1);
              this.name = rs.getString (2).trim();
              stmt.close();
         } // if
         else
              stmt.close();
              throw new NoSuchEntityException ("Invalid id " + id);
         }// else
              } // try
         catch (SQLException e)
         System.out.println("EJBLOad : " + e.getMessage());
              } // catch
         finally
         try
              if (con != null)
              con.close();
              }// try
         catch (SQLException e)
              System.out.println("EJBLOad finally" + e.getMessage());
              } // catch
              }// finally
         * ejbPassivate
         public void ejbPassivate() {
         * ejbRemove
         public void ejbRemove() throws javax.ejb.RemoveException {
         System.out.println ("Entering ejb Removed");
         try
         String sqlstmt = "delete from status where id=" + id;
         con = ds.getConnection();
         Statement stmt = con.createStatement();
         stmt.executeUpdate(sqlstmt);
         stmt.close();
         }// try
         catch (SQLException e)
         System.out.println("Ejb Remove" + e.getMessage());     
         } // catch
         finally
         try
              if (con!=null)
                   con.close();
         }// try
         catch (SQLException e)
              System.out.println ("EJBRemoved " + e.getMessage());
         } // catch
         } // finally
         * ejbStore
         public void ejbStore() {
         System.out.println("Entering the ejbStore");
         try
    String sqlstmt = "update status set id=" + id + ",name='" + name + "' where id=" + id;
         con = ds.getConnection();
         Statement stmt = con.createStatement();
         if (stmt.executeUpdate(sqlstmt) != 1)
              throw new EJBException ("Object state not saved");
    stmt.close();     
         } // try
         catch (SQLException e)
              System.out.println ("EJBStore : " + e.getMessage());
         }// catch
         finally
         try
              if (con != null)
              con.close();
         } // try
         catch(SQLException e)
              System.out.println ("EJBStore finally " + e.getMessage());
         } // catch
         } // finally
         * getEntityContext
         public javax.ejb.EntityContext getEntityContext() {
              return myEntityCtx;
         * setEntityContext
         public void setEntityContext(javax.ejb.EntityContext ctx) {
              myEntityCtx = ctx;
              try
              InitialContext initial = new InitialContext();
              ds = (DataSource)initial.lookup(dbname);
    } // try
              catch (NamingException e)
              throw new EJBException ("set Entity context : Invalid database");     
              }// catch
         * unsetEntityContext
         public void unsetEntityContext() {
              myEntityCtx = null;
         * ejbCreate
         public Integer ejbCreate(Integer key, String name) throws javax.ejb.CreateException {
    this.id = key.intValue();
    this.name = name;
              System.out.println ("Entering ejbCreated!!!");
              try
              String sqlstmt = "insert into status(id,name) values (" + id + ",'" + (name == null ? "" : name) + "')";
              con = ds.getConnection();
              Statement stmt = con.createStatement();
              stmt.executeUpdate(sqlstmt);
              stmt.close();
              }// try
              catch (SQLException e)
              System.out.println("EJBCreate : SQLEXception ");     
              }// catch
              finally
              try
              if (con!=null)
                   con.close();
              }// try
              catch (SQLException e)
              System.out.println ("EJB Created Finally : SQLException");
              e.getMessage();
              } // catch
              }// finally
              this.id = key.intValue();
              this.name = name;
              return key ;
         * ejbPostCreate
         public void ejbPostCreate(Integer id, String name) throws javax.ejb.CreateException {
         * ejbFindByPrimaryKey
         public Integer ejbFindByPrimaryKey(
              Integer key) throws javax.ejb.FinderException {
              try
              String sqlstmt = "select id from status where id=" + key.intValue();
              con = ds.getConnection();
              Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(sqlstmt);
              if (!rs.next())
              throw new ObjectNotFoundException();     
              } // if
              rs.close();
              stmt.close();
              } // try
              catch (SQLException e)
              System.out.println ("EJBFindBYPrimaryKey " + e.getMessage());     
              } // catch
              finally
              try
              if (con!=null)
                   con.close();
              }// try
              catch (SQLException e)
              System.out.println ("EJB Find by primary key" + e.getMessage());
              }// catch
              }// finally
              return key;
         * @return Returns the name.
         public String getName() {
              return this.name;
         * @return Returns id
         public int getId() {
              return this.id;
         * @param name The name to set.
         public void setName(String xname) {
              this.name = xname;
         * ejbFindByLastnameContaining
         public Enumeration ejbFindAllNamne () throws javax.ejb.FinderException
         try
         String sqlstmt = "select id from status order by id";
         con = ds.getConnection();
         Statement s = con.createStatement();
         ResultSet rs = s.executeQuery(sqlstmt);
         Vector keys = new Vector();
         while (rs.next())
              keys.add(new Integer(rs.getInt(1)));
         }// while
         rs.close();
         s.close();
         con.close();
         return keys.elements();
         } // try
         catch (SQLException e)
              throw new FinderException (e.toString());
         } // catch
    }

    Hi,
    if you look at your error message you will see the problem. In your code you've missed to implement
    public void ejbPassivate {}
    so your code looks like this
    import java.lang.Object;
    import javax.ejb.SessionBean;
    import javax.ejb.SessionContext;
    import java.rmi.RemoteException;
    import java.lang.Math;
    import java.util.Random;
    import java.io.*;
    /** * Title: * Description: * Copyright: Copyright (c) 2001 * Company: * @author * @version 1.0 */
    public class DiceEJB implements SessionBean, Serializable
         public int[] Roll()
              Random rng = new Random();
              int[] diceArray = new int[5];
              for(int i =0; i < diceArray.length;i++)
                   diceArray[i] = (Math.abs (rng.nextInt()) % 6) +1;
              return diceArray;
         public DiceEJB(){}
         public void ejbCreate() {}
         public void ejbRemove() {}
         public void ejbActivate() {}
         public void ejbPassivate() {}
         public void setSessionContext (SessionContext sc)
         private void writeObject(ObjectOutputStream oos) throws IOException
              oos.defaultWriteObject();
         private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException
              ois.defaultReadObject();
    bye

Maybe you are looking for