Call Enterprise Bean (or Database) from private Method in Session-Bean
Hi Everybody,
I've a question regarding the possibility to call an dependency injected EJB in an private method of a session bean.
Imagine the following.
@Stateless
public class SomeBean implements SomeLocal{
@EJB
private AnotherLocal anotherBean;
/** Will be called from a web-app via delegate layer */
@TransactionAttribute(TransactionAttribute.RequiresNew)
public void someBusisnessMethod(){
String something = this.getSomeThing();
//Do more
private String getSomeThing(){
return anotherBean.aMethodWhichCallsTheEntityManager();
}I've to refactor code with uses such Call-Hierachy and I want to know whether this is a correct way? Somebody told me that such stuff should not be made, and I quess he told me an explanation, why not to do such stuff, but unfortunally I've forgotten that. Do someone have a suggestion why not to do this? Could it blow the application to hell? Is there any difference to the following code (The way I would have done it)?
@Stateless
public class SomeBean implements SomeLocal{
@EJB
private AnotherLocal anotherBean;
@Resource
private SessionContext sessionContext;
/** Will be called from a web-app via delegate layer */
@TransactionAttribute(TransactionAttribute.RequiresNew)
public void someBusisnessMethod(){
SomeLocal self = this.sessionContext.getBusinessObject(SomeLocal.class);
String something = self.getSomeThingBusinessMethod();
//Do more
@TransactionAttribute(TransactionAttribute.Required)
public String getSomeThingBusinessMethod(){
return anotherBean.aMethodWhichCallsTheEntityManager();
}
Found the answer by myself....
Here it is if someone might have the same question:
http://stackoverflow.com/questions/3381002 or if the link may down sometime the content of the answer...
>
The motivation here is that most EJB implementations work on proxies. You wouldn't be too far off in thinking of it as old-school AOP. The business interface is implemented by the EJB container, quite often via a simple java.lang.reflect.Proxy, and this object is handed to everyone in the system who asks for the ejb via @EJB or JNDI lookup.
The proxy is hooked up to the container and all calls on it go directly to the container who will preform security checks, start/stop/suspend transactions, invoke interceptors, etc. etc. and then finally delegate the call to the bean instance -- and of course do any clean up required due to any exceptions thrown -- then finally hand the return value over through the proxy to the caller.
Calling this.foo() directly, or passing 'this' to a caller so they can make direct calls as well, will skip all of that and the container will be effectively cut out of the picture. The 'getBusinessObject(Class)' method allows the bean instance to essentially get a proxy to itself so it can invoke its own methods and make use of the container management services associated with it -- interceptors, transaction management, security enforcement, etc.
written by David Blevins
Similar Messages
-
Accesing database from static method on java collaboration
Hi *,
I want cache data from a oracle database in a java collaboratioon when java collaboration is enabled by emanager.
My java collaboration has a oracleOTD
I did an static method on java collaboration, but I can't access database from static method.
Thanks
Hectorhi hector,
this wont work!
regards chris -
Using only one method in session bean to create web service
Hi all,
I hhave a scenario where i am inserting and retrieving data from dict table using web service.
For this i have created a session bean and a wrapper class.
The session bean has two methods: insertRecords(), and viewRec().
so while creating a web service i need to include two methods.
I want to have only one method where i can pass a parameter as operation and if it is "I", then i can call the insert method and if it is "S" i can call view method.
I tried doing that bt i am stuck up with the return type.
Insert method has return type as array of wrapper class and
view method has wrapper class as return type ...
Is this scenario possible..??
or is there any other way to do this???
Plz let me knw..
Thankls n regards,
AnkitaHi Siddharth,
Im really sorry..
i cudnt get u ..
Actually these r methods:
public DemoDicModel[] viewRecords()
and
public DemoDicModel insertRecords(
String title,
String desc,
String status)
and im trying this:
public DemoDicModel[] getMethods(String operation,String title,String desc, String st)
DemoDicModel[] demoModel =null;
DemoDicModel model = new DemoDicModel();
if(operation == "show")
demoModel = viewRecords();
if(operation == "ins")
model = insertRecords(title,desc,st);
model.setMsg("RECORDS GENERATED");
demoModel=
return demoModel;
im stuck up with insert operation.
can u plz explain me in detail.
thanks,
ankita -
Plz help!! idempotent methods stateful session beans? (failover)
plz help!! idempotent methods stateful session beans? (failover)
Hi there,
Im trying to failover my shopping cart implemented using stateful ejb, the replication
is working but the failover is not (Object not found exception....).
By design is hard to think on an stateful ejb using idempotent methods, but after
checking the documentation in detail im completely confused, so im starting to
wonder if i should use idempotent methods or manual retry in case one server is
down.
Plz take a loo at these explanations about faiolver in the WLS edocs.
"....With clustered objects, automatic failover generally occurs only in cases
where the object is idempotent.....Because of this, replica-aware stubs will not,
by default, attempt to retry a method that fails after the request is sent but
before it returns. This behavior can be overridden by marking a service idempotent..."
BUT
"By default, a stateful session bean's Home stub provides load balancing and failover
for its method invocations to any clustered server where the bean is deployed...."
So is possible to achieve automatic failover (not only load balancing) for stateful
ejb without having to worry about state-changes or manual retry. (i know the retry
is requiered if the server crashed just before finishing a transaction but this
is not what im talking about).
Any help will be highly appreciated
Alan
Ryan,
Yes, im deploying using In-memory replication and clusterable elements, when try
to invoke the method (after one of the nodes is down) i recieve an "java.rmi.NoSuchObjectException:
Bean has been deleted".
I believe all this could be related to some sort of issue with JNDI Lookup in
the cluster, but haavent been able to get a clue to make it work....(almost desesperate
by now)
Alan
"ryan upton" <[email protected]> wrote:
>Alan,
>
>If the state isn't maintained during failover I would suspect a
>configuration error. Have you set the <replication-type> element within
><stateful-session-clustering> tag in the bean's deployment descriptor?
>
>"Alan" <[email protected]> wrote in message
>news:40e17cf7$1@mktnews1...
>>
>> Ryan,
>>
>>
>> Maybe i didnt explain myself, in the scenario im dealing with I KNOW
>the
>method
>> finished succesfully (example, the user succesfully added an item to
>a
>cart).
>>
>>
>> Just after that one of the nodes goes down, and the user decides to
>add a
>new
>> item (new invocation , not a retry of failed one) on the same session.
>>
>> This is the case in which failover should work automatically as you
>say,
>meaning
>> the new method invokation should be able to retrieve the session state
>info from
>> the replica and switch the primary.....Well, this is the part wich
>isnt
>working
>> :( as i understand it should transparently
>>
>> I believe could be a config issue , but have no way to make it work.
>>
>> Regards,
>>
>> Alan
>> "ryan upton" <[email protected]> wrote:
>> >
>> >"Alan" <[email protected]> wrote in message
>news:40e06296@mktnews1...
>> >>
>> >> Ryan,
>> >>
>> >> Thanks for clearing the both conditions a bit more, in this case
>my
>> >issue
>> >has
>> >> to do with the scenario #1 in which subsequent calls (invocations)
>> >go to a
>> >node
>> >> which isnt avaliable(down), do you have any idea of in what conditions
>> >the
>> >"automnatic"
>> >> failover would fail??? (meaning why the stub would try to dispatch
>> >a call
>> >to the
>> >> same previous node)
>> >>
>> >> Thanks for the help again
>> >>
>> >
>> >Subsequent calls won't go to a node that's down. That's the whole
>> >point
>> >;-). Failover is always automatic, what you are getting confused
>on
>> >is
>> >automatic method re-execution upon failover which happens if the method
>> >has
>> >been marked as idempotent. The logic is this: if I failover to an
>EJB
>> >that
>> >I know is still alive, I can't safely call the same method again.
> Why?
>> >Because I don't know how much of the method completed the last time
>before
>> >the previous bean's failure. So if the bean can yield multiple results
>> >from
>> >multiple invocations I had better play it safe and not re-execute
>the
>> >method
>> >on the bean I failed over to (unless it's idempotent because in that
>> >case it
>> >doesn't matter how many times I call it, it always does the same thing).
>> > In
>> >scenario #1 and #2 failover is automatic and all new calls are executed
>> >against the bean the client failed over to, but only idempotent methods
>> >are
>> >re-executed.
>> >
>> >
>>
>
>
-
Calling a pure C function from JNI method
Is it posible to call a pure C function from a JNI method.?
I am communicating with an external device whose API is written in C language.
Would it work this way
If I declare empty native methods in Java and those methods in C call pure C methods?
Thank You...Hello,
I have a similar problem and I posted it here http://www.velocityreviews.com/forums/t724826-jni-calling-an-outside-function-in-the-c-file-which-is-being-called-by-the-java-file.html. If you can answer the question, it would greatly help me.
Thanks
Nick -
Static methods in Session Beans problem
Can a Stateful Session Bean have a static method?
public static String foo();
I tried to add a static method to a Stateful Session bean but had two problems:
When I tried to add the static modifier to the Remote interface:
static String foo();
I got the following error message:
Error(12,17): modifier static not allowed here
When I tried to compile code calling this function :
MyClass.foo();
I got this message:
Error(795,42): non-static method getNewSuffix(java.lang.String) cannot be referenced from a static context
Even though a static method was compiled in this class. I assume it can't find the static modifier in the Remote interface which wasn't allowed. Are static methods allowed in EJB's at all?dear friend,
1) Interfaces may not contain static functions!
2) EJBs doesnt support static methods !
Maybe you should go and learn more about Java and EJB's ? -
Is it usefull syncronized method in session bean?
hi all
I know that each time I call a session bean my appllication server create one instance.
So i wonder if it's a wrong idea declaring each session bean methods syncronized.
RegardsIt's generally not a good practice to call your business classes directly from javascript.
But you can place a mediator (business delegate) java class inbetween and can access the session bean instead.
To access any java class using ajax, you may need a remoting library like DWR or JSON-RPC.
These libraries offer very powerful and easy way to use ajax in your application.
But if you want a more simpler solution, then have a look at libraries like "ajax4jsf" or "ajaxanywhere". -
JDEV 10.1.3 How to manipulate/Debug IndirectList from ejb 3.0 session bean
I was debugging my session bean a seen that element data for the employeesCollection was empty.
I didn't understood why my java client was throwing an error when i accessed manually the Departments collection and get the employeeCollection from the first entry in the collection. What was confusing me was that my master/detail jfs application was displaying these data. From where ? how was it possible ? it was the same session bean !
This is the reason i debugged the session bean return object and seen that the collection was also empty as the from executing from my java client application. I have seen the type of the object that was not a collection but IndirectList.
So my question ! how is it possible to load the collection of this type ? Which method the data control is executing to load it ? Where may i found a description of this very interesting process ?Hi Frank.
plain English - on plan :).
I create managed bean with function which do access to LDAP and this function 'return List<Users>'.
In JDeveloper :) on managed bean(java class) i create "Create Data Control"... after, from Data Controls i drop on page this data(create ADF Table with selectOne)...
First Page Ready!
Second page... i need to know which option selected on first page. This option(row) contains, UserName and etc... On second page i again fetch data, from LDAP, associated with this concrete UserName... Because i fetch data using managed bean :) i need to know this username in my managed bean...
May be :) im wrong...
sessionAttribute - like this? ->
* Convenience method for setting Session variables
* @param ctx FacesContext
* @param key object key
* @param object value to store
public static void storeOnSession(FacesContext ctx, String key, Object object) {
Map sessionState = ctx.getExternalContext().getSessionMap();
sessionState.put(key, object);
* Convenience method for getting Session variables
* @param ctx FacesContext
* @param key object key
public static Object getFromSession(FacesContext ctx, String key) {
Map sessionState = ctx.getExternalContext().getSessionMap();
return sessionState.get(key);
} -
Ejbpassivate and ejbactivate methods in session beans?
I have read in most of the sites that stateful session beans are not pooled, then when ejbpassivate and ejbactivate methods are used?
As per my understanding ,when SFSB are pooled and all SFSB are engaged in servicing then say some request comes. Then container tries to passivate the LRU SFSB anf make it available for new request. But i think it is required in case of pooling only.
If SFSB are not pooled is there any need of passivate/activate methods?It's not the SF EJB itself that is being used for multiple clients, it's the resources that are being used by the EJB that can be freed up for use by other objects while the EJB is passivated.
-
How to call external application (transaction launcher) from event method
Hi all
Can somebody tell me which program lines to put into an event handler method in a view controller to get an external application called. I intend to define the link to the external application in the Transaction Launcher. But I cannot find any instructions on how to call the Transaction Launcher from my event handler method. I do not want to launch the application from the navigation bar, ONLY via a link in a list of invoices in a table view, and I want to press the invoice number to get an external application called to display the invoice. My event handler method gets called fine enough, but I have no clue which program lines to put into the method to pass on the call to the Transaction Launcher
Best regards
Arne Thage / MarchIT / Denmarkhi,
check class CL_CRM_UI_LTX_NAVBAR_PARAM.
call method : CREATE_PARAMETER_OBJECT with parameters
IV_LINK_ID Importing Type CRMT_UI_LOGICAL_LINK_ID Logical Link ID
IV_PARAMETER Importing Type CRMT_UI_LINK_PARAMETER Link Parameter
RV_RESULT Returning Type Ref To IF_BOL_BO_PROPERTY_ACCESS BO Attribute
I think it should work but have never done myself.
Best Regards
Pankaj Kumar -
CALLING STORED PROCEDURE IN DATABASE FROM FORMS4.5
Is there any body know how to call stored procedure from Forms 4.5 ?
I am writing a when-button-pressed trigger.
Put the stored procedure name on there. But
it said "stored procedure name is not declared on this scope".
Thanks a lot
nullTry logging in to SQL*Plus and running the procedure, e.g....
SQL> begin
database_procedure_name(update_web);
end;
If it runs OK there, then it should run from within your form (provided that you are logged in as the same user as the test with SQL*Plus. -
Call of a function module from a method / catch of exceptions
Hello,
how do you catch the error of a function module that is called within the start routine of a data transfer process? The process terminates in case of an exceptions
E.G.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
client = sy-mandt
date = SOURCE_FIELDS-xxx
foreign_amount = SOURCE_FIELDS-xxx
foreign_currency = SOURCE_FIELDS-xxx
local_currency = SOURCE_FIELDS-xxx
IMPORTING
local_amount = RESULT
EXCEPTIONS
NO_RATE_FOUND = 1
OVERFLOW = 2
NO_FACTORS_FOUND = 3
NO_SPREAD_FOUND = 4
DERIVED_2_TIMES = 5
OTHERS = 6.uncomment the exceptions section of your call. ie
EXCEPTIONS
NO_RATE_FOUND = 1
OVERFLOW = 2
NO_FACTORS_FOUND = 3
NO_SPREAD_FOUND = 4
DERIVED_2_TIMES = 5
OTHERS = 6.
Afterwards check sy-subrc value to see if exception has occured. If it is zero, call was successful otherwise it will have a value corresponding to the exception occured (as specified in the code above) -
Multiple create methods of entity beans in single transcation
Hi,
I have some entity beans with CMR. I am managing these entity beans with a Stateful session bean whose transaction type is Container Managed for all its methods.
In one particular method of this Session bean I am calling two entity bean's create method. i.e I am creating two entity beans through home.create() methods. There are two home.create() methods one after another inside a try catch block.
I want that the entire operation be under just one transcation so i have also given the transaction attribute as Required for all methods of Session bean and Entity Beans.
However if i pass invalid parameters to second create method so that it generates exception then still the first create statement is successful and database is updated.
what i want is that the first create also should be roll backed.
How can i acheive this through Container Managed Transaction Session Bean?Hi Ashwini,
"Ashwini" <[email protected]> wrote in message news:400291af$[email protected]..
I have some entity beans with CMR. I am managing these entity beans with a Stateful session bean whose transactiontype is Container Managed for all its methods.
>
In one particular method of this Session bean I am calling two entity bean's create method. i.e I am creatingtwo entity beans through home.create() methods. There are two home.create() methods one after another inside a try catch
block.
>
I want that the entire operation be under just one transcation so i have also given the transaction attribute asRequired for all methods of Session bean and Entity Beans.
>
However if i pass invalid parameters to second create method so that it generates exception then still the firstcreate statement is successful and database is updated.
what i want is that the first create also should be roll backed.
How can i acheive this through Container Managed Transaction Session Bean?o Do you use TXDatasource with your entity beans?
o In CMT transactions are automatically rolled back only when RuntimeExceptions
are thrown. What kind of exception is thrown in your case?
Regards,
Slava Imeshev -
Insert data into table from JSP page using Entity Beans(EJB 3.0)
I want to insert data into a database table from JSP page using Entity Beans(EJB 3.0).
1. I have a table 'FRIENDS', (in Oracle 10g database).
2. It has two columns, 'NAME' and 'CITY'. Both have datatype strings(varchar2).
3. Now from a JSP page, having two textfields, 'NAME' and 'CITY', I want to insert data into table 'FRIENDS'.
4. In between JSP and database is a Entity Bean(EJB 3.0) and a stateless session bean.
5. I am using JDev as editor.
Please provide me code ASAP or link with similar example.
Thank you.
AnuragHi,
I am also trying that scenario. So u can
Post the jsp form data to a Servlet which will act as a Controller.
In the servlet invoke the business method.
Similar kind of app is in www.roseindia.net
Hope this would help u.
Meanwhile if u get any optimal solution, pls post it.
Thanks,
Happy Java Coding. -
How to send message to MessageDrivenBean from Session bean in JDeveloper
HI I am trying to write a sample program using JDeveloper.
I am trying to do these steps
1) client class which gets Session bean and calls its method.
2) write Stateless Session bean with a method which gets MDB and sends message.
3) write Message Driven Bean ( which prints message recieved from Session bean )
Set up
=======
jms.xml
{JDevHome}\jdev\system9.0.5.2.1618\oc4j-config\jms.xml : changed jms.xml file and included
<topic name="Demo Topic" location="jms/theTopic">
<description>A dummy topic</description>
</topic>
<topic-connection-factory name="Demo Topic Connection Factory" location="jms/theTopicConnectionFactory">
<description>A dummy topic connection factory</description>
</topic-connection-factory>
orion-ejb-jar.xml:
edited MDB entry to
<message-driven-deployment name="MessageLogger"
destination-location="jms/theTopic" connection-factory-location="jms/theTopicConnectionFactory">
</message-driven-deployment>
Implementation
===============
In client class:
I am getting session bean like
Properties props = System.getProperties();
props.put( javax.naming.Context.INITIAL_CONTEXT_FACTORY , "com.evermind.server.rmi.RMIInitialContextFactory");
props.put( javax.naming.Context.SECURITY_PRINCIPAL , "admin" );
props.put( javax.naming.Context.SECURITY_CREDENTIALS,"welcome");
props.put( javax.naming.Context.PROVIDER_URL ,"ormi://localhost:23891/current-workspace-app");
Context ctx = new InitialContext(props);
MySessionHome home = (MySessionHome)
javax.rmi.PortableRemoteObject.narrow(obj, MySessionHome.class);
This part works fine, and I am calling method on session bean created out of home.
In Session bean:
I want to get TopicConnectionFactory and tried these two ways:
a)
getting the context by setting new environemnt values like
Properties props = System.getProperties();
props.put( javax.naming.Context.INITIAL_CONTEXT_FACTORY , "com.evermind.server.jms.EvermindConnectionFactory");
props.put( javax.naming.Context.SECURITY_PRINCIPAL , "admin" );
props.put( javax.naming.Context.SECURITY_CREDENTIALS,"welcome");
props.put( javax.naming.Context.PROVIDER_URL ,"ormi://localhost:9227/current-workspace-app");
Context ctx = new InitialContext( props);
When I try this,it is complaining that it cannot instantiate EvermindConnectionFactory.
I am not sure which factory class we have to use here.i tried all the Factory class in that package.but didn't worked.
next I used,
b)
tried to use default context in session bean to get MDB factory
String TOPIC_NAME="jms/theTopic";
String TOPIC_CONNECTION_FACTORY="jms/theTopicConnectionFactory";
TopicConnectionFactory connectionFactory = (TopicConnectionFactory)new InitialContext().lookup("java:comp/env/" + TOPIC_CONNECTION_FACTORY);
this gives
04/06/13 23:46:09 javax.naming.NameNotFoundException: jms/theTopicConnectionFactory not found in MySession
04/06/13 23:46:09 at com.oracle.naming.J2EEContext.getSubContext(J2EEContext.java:93)
this may be because JMS server runs on different port than other EJBs and have different namespaces.
Can any body give info,how we can make use of Message Driven bean from a Session Bean or from a JSP page or from a simple class inside JDeveloper.
Thanks in advance.
gopalHi,
There are some hints in this forum for how to do this.
I put together and make it working.
This example creates an MD Bean and have a simple message and a client class send messages to that bean.
Steps
=====
1)
a)in {JDev Home}\jdev\system9.0.5.2.1618\oc4j-config\jms.xml
<topic name="Demo Topic" location="jms/demoTopic">
<description>A dummy topic</description>
</topic>
<topic-connection-factory name="Demo Topic Connection Factory" location="jms/theTopicConnectionFactory">
<description>A dummy topic connection factory</description>
</topic-connection-factory>
b) in current project in orion-ejb-jar.xml
go to orion-ejb-jar properties and add these values there to MDB node
destination-location=jms/demoTopic
connection-factory-location=jms/theTopicConnectionFactory
2) create a dummy session bean and a dummy client for that session bean
This sets default configuration for the client application we write
doing so we do not need to set properties to get Initial context.It makes use of
{JDev Home}\jdev\system9.0.5.2.1618\oc4j-config\.client\jndi.properties
We can directly get Contexxt ctx = new InitialContext();
3) Create MDB and put this sample code in method
onMessage()
TextMessage tm = (TextMessage) msg;
try {
String text = tm.getText();
System.err.println("Received new message : " + text);
catch(JMSException e) {
e.printStackTrace();
4) go to properties for the MDB and set Destination to Topic
5) write Client code
Context ctx =new InitialContext();
// 1: Lookup ConnectionFactory via JNDI
TopicConnectionFactory factory =
(TopicConnectionFactory) ctx.lookup("jms/theTopicConnectionFactory");
// 2: Use ConnectionFactory to create JMS connection
TopicConnection connection = factory.createTopicConnection();
// 3: Use Connection to create session
TopicSession session = connection.createTopicSession( false, Session.AUTO_ACKNOWLEDGE);
// 4: Lookup Desintation (topic) via JNDI
Topic topic = (Topic) ctx.lookup("jms/demoTopic");
// 5: Create a Message Producer
TopicPublisher publisher = session.createPublisher(topic);
// 6: Create a text message, and publish it
TextMessage msg = session.createTextMessage();
msg.setText("This is a test message from My Test Client!!! .");
publisher.publish(msg);
6) Run the server and run the client
Maybe you are looking for
-
I cannot change my Apple ID account info
Hi! I have a problem: my old living adress is linked to my Apple ID as an extra adress and also as default shipping adress. Since I moved some time ago, I want to go to https://appleid.apple.com to change the info. However, this happens: (I translate
-
I recently upgraded my OS to Lion 10.7.4. I also just upgraded from a 1st Generation Time Capsule to a 4th Generation Time Capsule. I have an Airport Express (Version A1264) that I formerly used to extend my wireless network. Airport Express no lo
-
Can a portable USB 3.0 HDD be partitioned and formatted FAT32 and Mac OS Extended?
I wish to use a portable HDD on a Windows laptop and also my iMac. I realise that if I format it as FAT32 it will work on both. Unfortunately I also need it to work with Final Cut Pro X . . . but FCP X can only recognise Mac OS Extended drives. S
-
I have a thread that checks a mailbox using pop3 protocol. I'm currently using jdk1.3.1 and JavaMail 1.2. The operating system is linux. The problem is that after some variant time the code to connect to the host blocks. The method call is the follow
-
N85 connects to the internet when having a call.
Hi all ! Since i've changed my data plan, i've set up my n85 to use 3G networks (before i disabled this function to save battery). So now, everytime i'm having a call, the phone connects to the internet (either via 3G either via wifi). First, is this