On 9/15/06, stephan opitz <[EMAIL PROTECTED]> wrote:
as i reviewed example from jboss: http://docs.jboss.org/ejb3/app-server/tutorial/injection/injection.html To facilitate test driven development, the EJB 3.0 specification allows you to use annotations to inject dependencies through annotations on fields or setter methods. Instead of complicated XML ejb-refs or resource refs, you can use the @EJB and @Resource annotations to set the value of a field or to call a setter method within your session bean with anything registered within JNDI. You can use the @EJB annotation to inject EJB references and @Resource to access datasources. in conclusion that ejb incejtion only works if registration is within jndi, so beans under registred ejb stateful or stateless beans should work without problems as managed bean i gave up
Three comments: * Did you remove the @Bean annotation as I suggested? Leaving it there is ***guaranteed*** to make injectino fail. * I know for a fact that injecting things works on a certified Java EE 5 server (Glassfish). See the shale-mailreader-jpa example, and note that the Logic bean gets its EntityManagerFactory bean injected, without any explicit registration of JNDI resource. * Why are you expecting Java EE 5 compliant behavior from a container that is not yet Java EE 5 compliant? If there's an issue here, it seems likely to be with JBoss, if they claim to do the resource injection but do not do so. Craig 2006/9/15, stephan opitz <[EMAIL PROTECTED]>:
> it will created by jsf - i see that tiger annotation does not work at this point > > it seems my problem lies in implementation if the injection > > public class DataFactory { > > @EJB > private CategoriesLangFacade categoriesLangFacade; > > public CategoriesLangFacade getCategoriesLangFacade() { > > return categoriesLangFacade; > } > > } > > ///////////////////////////////////////////////////////////////////////////// > > @Local > public interface CategoriesLangFacade { > > public CategoriesLang findById(long categoriesLangId, long languageId); > > } > > ####################################### > > @Stateless > public class CategoriesLangImp implements CategoriesLangFacade { > > @PersistenceContext(unitName = "ShaleTestPU") > private EntityManager em; > > public static final String Remote = CategoriesLangImp.class > .getSimpleName() > + "/remote"; > > public static final String Local = CategoriesLangImp.class > .getSimpleName() > + "/local"; > > public CategoriesLang findById(long categoriesLangId, long languageId) { > ... > } > > } > > but this is the way how to > > an @local interface, an stateless ejb and DataFactory which should > create injection > > > > 2006/9/15, Craig McClanahan <[EMAIL PROTECTED]>: > > On 9/15/06, stephan opitz <[EMAIL PROTECTED]> wrote: > > > > > > does indeed work - i tried under jboss so many different versions of > > > implementation... > > > > > > craig i know your mailreader jpa based on glassfish... > > > > > > That is true, but I had to follow the advice I gave you ... I had to make > > the backing beans that receive injection into standard JSF managed beans, > > not using the Shale Tiger @Bean annotation. > > > > maybe it is because of jboss ejb implementation? > > > > > > my managed bean "datafactory" is in the ejb-jar and defined in > > > faces-config.xml > > > i have access from any shale model class > > > > > > Be sure to take @Bean off as well ... if you leave it there, the Tiger > > extensions will be creating the bean, instead of JSF itself, so the > > injections will not occur. > > > > Craig > > > > if i debug i see > > > > > > @Resource > > > SessionContext sc; > > > is null > > > > > > maybe i have a generall problem with the jboss > > > > > > does exist any tiger annotation for the postback value? > > > > > > 5, Craig McClanahan <[EMAIL PROTECTED]>: > > > > On 9/15/06, stephan opitz <[EMAIL PROTECTED]> wrote: > > > > > > > > > > craig... > > > > > > > > > > the possibility with indirect works only if i do a jndi lookup... > > > > > > > > > > @Bean(name = "dataFactory", scope = Scope.SESSION) > > > > > public class DataFactory { > > > > > > > > > > @EJB > > > > > private CategoriesLangFacade categoriesLangFacade; > > > > > > > > > > public CategoriesLangFacade getCategoriesLangFacade() { > > > > > > > > > > return categoriesLangFacade; > > > > > } > > > > > > > > > > } > > > > > > > > > > solves categoriesLangFacade as null; > > > > > > > > > > without @EJB and jndi-lookup in the getCategoriesLangFacade it works > > > > > under jbos s4.04ga - but why resource injection does not work ? > > > > > > > > > > > > Container resource injection only works on what the *container* thinks > > > is a > > > > JSF managed bean that *it* created. The Tiger Extensions stuff (@Bean) > > > > intercepts the normal process and creates the bean itself, and can't do > > > any > > > > injections. If you made this a normal managed bean (configured in > > > > faces-config.xml), you'll find that the resource injection does indeed > > > work. > > > > > > > > It would be an interesting challenge to examine whether it's even > > > *possible* > > > > to fake the container's normal resource injection for stuff like this. > > > > > > > > Craig > > > > > > > > ######################################## > > > > > > > > > > public interface CategoriesLangFacade { > > > > > > > > > > public CategoriesLang findById(long categoriesLangId, long > > > > > languageId); > > > > > > > > > > } > > > > > > > > > > ####################################### > > > > > > > > > > @Local({CategoriesLangFacade.class}) > > > > > @Stateless > > > > > public class CategoriesLangImp implements CategoriesLangFacade { > > > > > > > > > > @PersistenceContext(unitName = "ShaleTestPU") > > > > > private EntityManager em; > > > > > > > > > > public static final String Remote = CategoriesLangImp.class > > > > > .getSimpleName() > > > > > + "/remote"; > > > > > > > > > > public static final String Local = CategoriesLangImp.class > > > > > .getSimpleName() > > > > > + "/local"; > > > > > > > > > > public CategoriesLang findById(long categoriesLangId, long > > > > > languageId) { > > > > > ... > > > > > > > > > > > > > > > any solution or idea? > > > > > > > > > > > > > > > > > > > > 2006/9/13, stephan opitz <[EMAIL PROTECTED]>: > > > > > > i tried comparable, but without success. > > > > > > > > > > > > anyone who can helps? > > > > > > > > > > > > 2006/9/12, numpsy beelzebub <[EMAIL PROTECTED]>: > > > > > > > thx craig, > > > > > > > > > > > > > > > > > > > > > > It is possible to access the stateful session bean *indirectly*, > > > if > > > > > you > > > > > > > > declare it in a managed bean and then provide a public > > > getter. The > > > > > > > simplest > > > > > > > > way to do this is to leverage the resource injection > > > capabilities of > > > > > a > > > > > > > Java > > > > > > > > EE 5 container, so you might have something like this: > > > > > > > > > > > > > > > @EJB > > > > > > > > private MySessionBean mySessionBean; > > > > > > > > > > > > > > > public MySessionBean getMySessionBean() { return > > > > > this.mySessionBean; } > > > > > > > > > > > > > > > and you can then use a binding expression like "#{ > > > > > foo.mySessionBean.bar}" > > > > > > > > where "foo" is the name of the managed bean containing the above > > > > > > > > declaration, and "bar" is a property on the session bean itself. > > > > > > > > > > > > > > > If you are not running inside an EE 5 app server, you'll have to > > > do > > > > > the > > > > > > > > usual sort of JNDI lookup to get a reference to the stateful > > > session > > > > > bean > > > > > > > > instead. If you're using Shale's ViewController capabilities, > > > the > > > > > init() > > > > > > > > method would be a good place to do that so the bean will be > > > > > available to > > > > > > > > other event handlers (and rendering) associated with this bean. > > > > > > > > > > > > > > can't follow exactly > > > > > > > now i use jboss and ask for my entity beans from shale model > > > objects > > > > > > > try { > > > > > > > Context context = new InitialContext(); > > > > > > > contactNotesFassade = (ContactNotesFassade) context > > > > > > > .lookup(Constants.ProjectNameSeparator > > > > > > > + ContactNotesFassadeImp.Local); > > > > > > > } catch (NamingException e) { > > > > > > > messageLang.setFacesMessage("error.ejb"); > > > > > > > } > > > > > > > can image how this @EJB works with shale and how i can have easy > > > > > access in > > > > > > > clay etc... > > > > > > > 1. i declare a stateful session bean mySessionBean mySessionBean > > > > > > > ejb-web-project part > > > > > > > 2. an interface with local - here the part with your @EJB code > > > > > > > 3. access to interface in modelbeans of shale - as you told in > > > > > init()-method > > > > > > > > > > > > > > how i can have access in clay to this away stateful ejb > > > > > > > > > > > > > > > > > > > > > :-/ > > > > > > > > > > > > > > 2006/9/11, Craig McClanahan <[EMAIL PROTECTED]>: > > > > > > > > > > > > > > > On 9/11/06, numpsy beelzebub <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > > > > > > > hello, > > > > > > > > > > > > > > > > > > i want to developed an application using shale and ejb 3.0(within > > > > > > > > > container > > > > > > > > > jboss). > > > > > > > > > primary i used stateless session beans for access to the > > > entity > > > > > beans - > > > > > > > > > persistenz-layer is ok and how to work with it > > > > > > > > > > > > > > > > > > as session i will declare a managed bean with an application > > > scope > > > > > > > > > "session" > > > > > > > > > and save my data in it. > > > > > > > > > i thought it is the fastest and easiest way, but in comparing > > > to > > > > > > > > stateful > > > > > > > > > session beans it is not the only possible solution. > > > > > > > > > > > > > > > > > > in addition to this a few questions: > > > > > > > > > > > > > > > > > > 1. i'm fit in clay and know how to access normally ejb 3.0from > > > > > shale's > > > > > > > > > application-logic (building context etc) > > > > > > > > > but how is it possible to access stateful session bean from > > > view > > > > > etc. > > > > > > > > > (normally i have direct access, if it is declared as managed > > > bean) > > > > > > > > > > > > > > > > > > > > > > > > It is possible to access the stateful session bean *indirectly*, > > > if > > > > > you > > > > > > > > declare it in a managed bean and then provide a public > > > getter. The > > > > > > > > simplest > > > > > > > > way to do this is to leverage the resource injection > > > capabilities of > > > > > a > > > > > > > > Java > > > > > > > > EE 5 container, so you might have something like this: > > > > > > > > > > > > > > > > @EJB > > > > > > > > private MySessionBean mySessionBean; > > > > > > > > > > > > > > > > public MySessionBean getMySessionBean() { return > > > > > this.mySessionBean; } > > > > > > > > > > > > > > > > and you can then use a binding expression like "#{ > > > > > foo.mySessionBean.bar}" > > > > > > > > where "foo" is the name of the managed bean containing the above > > > > > > > > declaration, and "bar" is a property on the session bean itself. > > > > > > > > > > > > > > > > If you are not running inside an EE 5 app server, you'll have to > > > do > > > > > the > > > > > > > > usual sort of JNDI lookup to get a reference to the stateful > > > session > > > > > bean > > > > > > > > instead. If you're using Shale's ViewController capabilities, > > > the > > > > > init() > > > > > > > > method would be a good place to do that so the bean will be > > > > > available to > > > > > > > > other event handlers (and rendering) associated with this bean. > > > > > > > > > > > > > > > > > > > > > > > > 2. i have to initalize context for access ejb, so i thought > > > maybe > > > > > declare > > > > > > > > a > > > > > > > > > interface as managed bean which gives access to stateful > > > session > > > > > bean > > > > > > > > > does exist a method in shale except init(), that would be > > > > > called for > > > > > > > > > every request, so that i can initialize my access-context > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Why do you need a method other than init()? That is exactly > > > what it > > > > > is > > > > > > > > for. > > > > > > > > > > > > > > > > > > > > > > > > 3. if i want to use stateful-session ejb 3.0 - how is it > > > possible > > > > > out from > > > > > > > > > session to define when access of specific user ends. > > > > > > > > > maybe saving access to stateful-session ejb 3.0 into some > > > kind > > > > > of > > > > > > > > state > > > > > > > > > bean in shale declared as managed bean with session scope -> > > > but > > > > > if i do > > > > > > > > > it > > > > > > > > > so it seems strange > > > > > > > > > > > > > > > > > > > > > > > > My understanding of the typical scenario for Stateful session > > > beans > > > > > is > > > > > > > > that, > > > > > > > > when you want the user's access to end (i.e. they log out or > > > > > something), > > > > > > > > then you'll call the remove method o the stateful session bean > > > to > > > > > make it > > > > > > > > go > > > > > > > > away. > > > > > > > > > > > > > > > > > > > > > > > > i save access to a ejb, but i could save the data also direct > > > > > > > > > 4. generally problem - session in shale is only a javabean > > > with > > > > > the > > > > > > > > > session > > > > > > > > > scope > > > > > > > > > <-> stateful session bean is server side component > > > > > (differences are > > > > > > > > > clear, but what is best to use - where lies advantages) > > > > > > > > > > > > > > > > > > it is also a problem because jboss seam gives possibilities > > > for my > > > > > > > > > problems > > > > > > > > > > > > http://www.javaworld.com/javaworld/jw-05-2006/jw-0515-jsf-p3.html > > > > > > > > > > > > > > > > > > maybe i need some impressions of developer with some kind of > > > more > > > > > > > > > experience, including th developers of shale > > > > > > > > > > > > > > > > > > > > > > > > Seam encourages you (but does not require you) to use a stateful > > > > > session > > > > > > > > bean (SFSB) in a manner fairly similar to using a session > > > scoped > > > > > backing > > > > > > > > bean in a regular JSF application. If you're using an SFSB for > > > your > > > > > > > > business logic anyway, this can save you writing one class (the > > > > > typical > > > > > > > > sort > > > > > > > > of backing bean) that primarily serves as an adapter role. The > > > > > tradeoff > > > > > > > > is > > > > > > > > that you'll typically end up tying the SFSB class to web tier > > > APIs > > > > > instead > > > > > > > > of being able to make it independent. > > > > > > > > > > > > > > > > A couple of other considerations: > > > > > > > > > > > > > > > > * If you're using Shale view controllers, that only works for > > > > > request > > > > > > > > scope > > > > > > > > beans, > > > > > > > > so you won't be able to make your SFSB class "implements > > > > > ViewController" > > > > > > > > and get those sorts of event callbacks. > > > > > > > > > > > > > > > > * A SFSB is automatically a transactional resource (depending on > > > > > what > > > > > > > > annotations > > > > > > > > or XML metadata settings you use to configure it), so you don't > > > have > > > > > to > > > > > > > > worry > > > > > > > > about explicitly committing transactions (although you might > > > still > > > > > need to > > > > > > > > roll back > > > > > > > > if you're partway through an update and you need to abort > > > it). You > > > > > can > > > > > > > > access > > > > > > > > things like JPA entity classes directly from a JSF backing bean, > > > but > > > > > you > > > > > > > > need to > > > > > > > > manage transactions yourself. > > > > > > > > > > > > > > > > * A SFSB can only be accessed by one thread at a time, so you > > > might > > > > > find > > > > > > > > yourself > > > > > > > > in a situation where the locking that enforces this can cause > > > you > > > > > > > > performance issues. > > > > > > > > A classic case is where you've got lots of AJAX-ish calls coming > > > in > > > > > from > > > > > > > > the client, > > > > > > > > such that there will be multiple requests (on different threads) > > > to > > > > > the > > > > > > > > same session bean > > > > > > > > at the same time. With session scoped backing beans, the calls > > > > > happen > > > > > > > > simultaneously > > > > > > > > (but, of course, that means you also need to code your methods > > > in a > > > > > > > > threadsafe manner). > > > > > > > > With an SFSB you don't have to worry about coding for > > > simultaneous > > > > > access, > > > > > > > > but you do > > > > > > > > need to worry about the performance impact of the locking. > > > > > > > > > > > > > > > > Craig > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > thx so much > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >