Revision history [back]

click to hide/show revision 1
initial version

asked 2011-07-19 08:26:39 +0800

marcelodecampos gravatar image marcelodecampos

EJB 3.1 Injection using annotation

I really do not like to bother, but I need a help: I am currently now testing a new application using EJB 3.1 and can not use dependency injection in the controller. But work on a regular servlet. It seems obvious that this should be no problem with zk. If someone went through something similar and can help me thank you. If I use jndi lookup works perfectly, of course. Let the code:

This is a simple zul file:

<?page title="Auto Generated index.zul"?>
<window title="Hello World!!" border="normal" width="100%" apply="TestController">
    <div align="Center">
        <vlayout>
            <label value="You are using: ${desktop.webApp.version}"/>
            <button label="Load List" id="btnLoad"  />
            <listbox id="listObjects" vflex="true" mold="paging" autopaging="true" >
                <listhead>
                    <listheader label="This is my list" sort="auto" >
                    </listheader>
                </listhead>
            </listbox>
        </vlayout>
    </div>
</window>

And this is the zul controller:

import java.util.Collections;
import java.util.List;

import javax.ejb.EJB;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;

import br.com.mcampos.ejb.system.entity.Menu;
import br.com.mcampos.ejb.system.menu.session.MenuServiceRemote;


public class TestController extends GenericForwardComposer
{
    private static final long serialVersionUID = -5998869122000174965L;
    private Listbox listObjects;

    @EJB
    private MenuServiceRemote service; // THE problem!!!!!!

    @Override
    public void doAfterCompose( Component comp ) throws Exception
    {
        super.doAfterCompose( comp );
        List<Menu> list = Collections.emptyList( );

        if ( service != null ) // THIS IS ALWAYS NULL????
            list = service.getAll( );
        listObjects.setModel( new ListModelList ( list ) ); //we don't have a render,but doesn't matter now
    }
}

Just in case, I've made a simple servlet just in case and it works!!!! Annoying!

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/test")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public TestServlet() {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGetPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGetPost(request, response);
    }

    @EJB
    private MenuServiceRemote service;  // THIS IS THE SAME OF MY CONTROLLER

    private void doGetPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType( "text/html;charset=UTF-8" );
        PrintWriter out = response.getWriter( );
        out.println ( "<html><body></body></html>");
        if ( service != null ) {                               // ######NOT NULL######, it works :(
            List<Menu> list = service.getAll( );
            for ( Menu item : list ) {
                out.println ( "<br /> " + item.getMnuDescriptionCh( ) );
            }
        }
        out.println ( "</body></html>");
        out.close ();
    }
}

The code's boring part - Entity + SessionBean + Interface:

@Entity
@Table(name="menu")
public class Menu implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer mnuIdIn;
    private Boolean mnuAutocheckBt;
    private Boolean mnuCheckedBt;
    private Boolean mnuCheckmarkBt;
    private String mnuDescriptionCh;
    private Boolean mnuDisabledBt;
    private Boolean mnuSeparatorBeforeBt;
    private Integer mnuSequenceIn;
    private String mnuUrlCh;
    private Menu menu;
    private List<Menu> menus;
    private Media media;

    public Menu() {
    }


    @Id
    @Column(name="mnu_id_in", unique=true, nullable=false)
    public Integer getMnuIdIn() {
        return this.mnuIdIn;
    }

    public void setMnuIdIn(Integer mnuIdIn) {
        this.mnuIdIn = mnuIdIn;
    }


    @Column(name="mnu_autocheck_bt")
    public Boolean getMnuAutocheckBt() {
        return this.mnuAutocheckBt;
    }

    public void setMnuAutocheckBt(Boolean mnuAutocheckBt) {
        this.mnuAutocheckBt = mnuAutocheckBt;
    }


    @Column(name="mnu_checked_bt")
    public Boolean getMnuCheckedBt() {
        return this.mnuCheckedBt;
    }

    public void setMnuCheckedBt(Boolean mnuCheckedBt) {
        this.mnuCheckedBt = mnuCheckedBt;
    }


    @Column(name="mnu_checkmark_bt")
    public Boolean getMnuCheckmarkBt() {
        return this.mnuCheckmarkBt;
    }

    public void setMnuCheckmarkBt(Boolean mnuCheckmarkBt) {
        this.mnuCheckmarkBt = mnuCheckmarkBt;
    }


    @Column(name="mnu_description_ch", nullable=false, length=64)
    public String getMnuDescriptionCh() {
        return this.mnuDescriptionCh;
    }

    public void setMnuDescriptionCh(String mnuDescriptionCh) {
        this.mnuDescriptionCh = mnuDescriptionCh;
    }


    @Column(name="mnu_disabled_bt")
    public Boolean getMnuDisabledBt() {
        return this.mnuDisabledBt;
    }

    public void setMnuDisabledBt(Boolean mnuDisabledBt) {
        this.mnuDisabledBt = mnuDisabledBt;
    }


    @Column(name="mnu_separator_before_bt")
    public Boolean getMnuSeparatorBeforeBt() {
        return this.mnuSeparatorBeforeBt;
    }

    public void setMnuSeparatorBeforeBt(Boolean mnuSeparatorBeforeBt) {
        this.mnuSeparatorBeforeBt = mnuSeparatorBeforeBt;
    }


    @Column(name="mnu_sequence_in", nullable=false)
    public Integer getMnuSequenceIn() {
        return this.mnuSequenceIn;
    }

    public void setMnuSequenceIn(Integer mnuSequenceIn) {
        this.mnuSequenceIn = mnuSequenceIn;
    }


    @Column(name="mnu_url_ch", length=1024)
    public String getMnuUrlCh() {
        return this.mnuUrlCh;
    }

    public void setMnuUrlCh(String mnuUrlCh) {
        this.mnuUrlCh = mnuUrlCh;
    }


    //bi-directional many-to-one association to Menu
    @ManyToOne
    @JoinColumn(name="mnu_parent_id")
    public Menu getMenu() {
        return this.menu;
    }

    public void setMenu(Menu menu) {
        this.menu = menu;
    }


    //bi-directional many-to-one association to Menu
    @OneToMany(mappedBy="menu")
    public List<Menu> getMenus() {
        return this.menus;
    }

    public void setMenus(List<Menu> menus) {
        this.menus = menus;
    }


    //bi-directional many-to-one association to Media
    @ManyToOne (optional = true)
    @JoinColumn(name="med_id_in")
    public Media getMedia() {
        return this.media;
    }

    public void setMedia(Media media) {
        this.media = media;
    }

}

This is a simple SessionBean, using a remote interface

@Stateless
public class MenuService implements MenuServiceRemote
{

    @PersistenceContext
    private transient EntityManager em;

    @Override
    @SuppressWarnings( "unchecked" )
    public List<Menu> getAll( )
    {
        Query query = getEntityManager( ).createQuery( "SELECT m FROM Menu m ORDER BY m.mnuDescriptionCh" );

        return query.getResultList( );
    }


    private EntityManager getEntityManager ()
    {
        return em;
    }

}

The Remote Interface:

@Remote
public interface MenuServiceRemote {
    List<Menu> getAll ();
}
Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More