Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: How to change remote JNDI-name in Jonas

Florent BENOIT <[email protected]> Fri, 26 Aug 2011 11:54:18 +0200
Newsgroups gmane.comp.java.objectweb.jonas
Message-ID <[email protected]>
     Hi,

You may apply the same rule for local bean


Regards,

Florent

On 08/26/2011 11:28 AM, Stefaan Somers wrote:
> Hi,
>
> using the ejb-jar.xml, and defining the same class as a different bean
> using the mappedName worked. So I can access the remote bean now with
> a specific name.
> Now I have a similar problem with the local bean. Is there any way I
> can make a difference in naming there???
>
> Greetings,
>
> Stefaan Somers
>
> <?xml version="1.0" encoding="UTF-8"?>
> <ejb-jar version="3.0" 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">
>    <display-name>
> EducationEJB3Beans</display-name>
> <enterprise-beans>
> <session>
> 		<display-name>ParametersRemote</display-name>
> 		<ejb-name>ParametersRemote</ejb-name>
> 		<mapped-name>MyApp_ParametersRemote</mapped-name>
>           <business-remote>be.sso.test.ParametersRemote</business-remote>
>           <ejb-class>be.sso.test.Parameters</ejb-class>
>           <session-type>Stateless</session-type>
>
> </session>
> <session>
> 		<display-name>ParametersLocal</display-name>
> 		<ejb-name>MyApp_ParametersLocal</ejb-name>
> 		<mapped-name>MyApp_ParametersLocal</mapped-name>
> 		<business-local>be.sso.test.ParametersLocal</business-local>
>           <ejb-class>be.sso.test.Parameters</ejb-class>
>           <session-type>Stateless</session-type>
>
>
>
> </session>
> </enterprise-beans>
>   </ejb-jar>
>
> On 9 August 2011 14:52, Guillaume Sauthier (OW2)
> <[email protected]>  wrote:
>> OK I think got it.
>> The problem with mappedName attribute is that we have only 1 value that must
>> be used for all our interfaces: local/remote/ws/...
>> So, there are names clashes when you specify mappedname and you have
>> multiple interfaces.
>> EJB3 Spec is not good on this point :'(
>>
>> So it seems we have very few options right now:
>> * Separate your applications on independant JOnAS (separate JNDI registry
>> means no clashes)
>> * Mutualize your EJB between your applications so that there is only 1
>> instance of your bean
>>
>> But this is an interesting use case that we would like to support, so i
>> would be grateful if you could open a JIRA explaining the issue.
>> For the more long term, we may come with a more elegant solution:
>> Customize the naming strategy to differentiate JNDI names from beans in
>> different applications:
>> something that could be placed in the easybeans.xml file (either in global
>> or ejbjar configuration)
>> <strategy>${beanName}-${beanInterface}@${beanMode}</strategy>
>> or
>> <mapped-names>
>>    <local>MyLocalBean</local>
>>    <remote>MyRemoteBean</remote>
>> </mapped-names>
>>
>> Thanks
>> --G
>>
>> 2011/8/9 Stefaan Somers<[email protected]>
>>> Guillaume,
>>>
>>> OK but if 2 Beans normally have the same package-name&  ClassName in 2
>>> different applications (different jar-components), there can be only 1
>>> JNDI-entry for the remote interface. So there is the danger that 1
>>> application is going to the wrong JNDI-entry.
>>>
>>>
>>> For example we have 2 applications with each an account-component
>>> (with Account-bean that is used for logon information). Last time when
>>> I deployed the 2 applications, the one application was using the
>>> account-data from the other application.
>>>
>>> I hope it's a bit clear for you??
>>>
>>> Greetings,
>>>
>>> Stefaan Somers
>>>
>>> On 9 August 2011 13:51, Guillaume Sauthier (OW2)
>>> <[email protected]>  wrote:
>>>> EasyBeans (the EJB3 container in JOnAS) gives priority to beans found in
>>>> the
>>>> same application if there is multiple match.
>>>> The EJB3 spec mandates that behavior so you're safe :)
>>>> Just make a try.
>>>> --G
>>>>
>>>> 2011/8/9 Stefaan Somers<[email protected]>
>>>>> But,
>>>>>
>>>>> our applications are generated, so we can have for example 2
>>>>> account-beans in 2 different applications. Therefore we must be able
>>>>> to uniquely identify the 2 remote JNDI interfaces to the 2 different
>>>>> applications. That's why we are using "mappedName"
>>>>>
>>>>> Greetings,
>>>>>
>>>>> Stefaan Somers
>>>>>
>>>>> On 9 August 2011 11:55, Guillaume Sauthier (OW2)
>>>>> <[email protected]>  wrote:
>>>>>> You should also remove your mapped names (don't needed anymore
>>>>>> because
>>>>>> you
>>>>>> rely on the container to find the right interface for you).
>>>>>>
>>>>>> --G
>>>>>>
>>>>>> 2011/8/9 Stefaan Somers<[email protected]>
>>>>>>> Hello,
>>>>>>>
>>>>>>> I'v tried that too, but it also injects the remote-bean then instead
>>>>>>> of the local-bean.
>>>>>>>
>>>>>>> Greetings,
>>>>>>>
>>>>>>> Stefaan Somers
>>>>>>>
>>>>>>> On 9 August 2011 11:04, Guillaume Sauthier (OW2)
>>>>>>> <[email protected]>  wrote:
>>>>>>>> Can't you change your Calculator.java to something like this:
>>>>>>>>
>>>>>>>> It's much more easier to read :)
>>>>>>>>
>>>>>>>> /**
>>>>>>>>   * Session Bean implementation class Calculator
>>>>>>>>   */
>>>>>>>> @Stateless
>>>>>>>> public class Calculator implements CalculatorRemote,
>>>>>>>> CalculatorLocal
>>>>>>>> {
>>>>>>>>
>>>>>>>>    @EJB
>>>>>>>>    private ParametersLocal params;
>>>>>>>>
>>>>>>>>
>>>>>>>>      /**
>>>>>>>>       * Default constructor.
>>>>>>>>       */
>>>>>>>>      public Calculator() {
>>>>>>>>
>>>>>>>>      }
>>>>>>>>
>>>>>>>>      @Override
>>>>>>>>      public String returnMessage() {
>>>>>>>>          result = parameters.getParameter();
>>>>>>>>          return "It's all being calculated :" + result;
>>>>>>>>      }
>>>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>>> 2011/8/9 Stefaan Somers<[email protected]>
>>>>>>>>> Hi Guillaume,
>>>>>>>>> Thnks for responding. I'm already banging my head for a few days
>>>>>>>>> with
>>>>>>>>> this problem. So any help would be most welcome.
>>>>>>>>>
>>>>>>>>> I've included a sample project. For the Parameters-bean I use the
>>>>>>>>> mappedName parameter, since I need to give it a unique-name.
>>>>>>>>>
>>>>>>>>> If I try to get the Local Parameters-bean with the
>>>>>>>>> Calculator-bean,
>>>>>>>>> it
>>>>>>>>> gives me the following exception :
>>>>>>>>>
>>>>>>>>> java.lang.ClassCastException: $Proxy63 cannot be cast to
>>>>>>>>> be.sso.test.ParametersLocal
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> be.sso.test.Calculator.original$EasyBeans$returnMessage(Calculator.java:34)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.gen.invocationcontext.be.sso.test.Calculator.EasyBeansInvocationContextImplreturnMessageAROUNDINVOKE1942950347.proceed(Unknown
>>>>>>>>> Source)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.transaction.interceptors.CMTRequiredTransactionInterceptor.intercept(CMTRequiredTransactionInterceptor.java:110)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.gen.invocationcontext.be.sso.test.Calculator.EasyBeansInvocationContextImplreturnMessageAROUNDINVOKE1942950347.proceed(Unknown
>>>>>>>>> Source)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.jonas.jndi.interceptors.impl.easybeans.ResourceCheckerInterceptor.intercept(ResourceCheckerInterceptor.java:103)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.gen.invocationcontext.be.sso.test.Calculator.EasyBeansInvocationContextImplreturnMessageAROUNDINVOKE1942950347.proceed(Unknown
>>>>>>>>> Source)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.jonas.ejb.easybeans.JOnASENCInterceptor.intercept(JOnASENCInterceptor.java:67)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.gen.invocationcontext.be.sso.test.Calculator.EasyBeansInvocationContextImplreturnMessageAROUNDINVOKE1942950347.proceed(Unknown
>>>>>>>>> Source)
>>>>>>>>>         at be.sso.test.Calculator.returnMessage(Calculator.java)
>>>>>>>>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>>>>>>>>> Method)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>>>>>>         at java.lang.reflect.Method.invoke(Method.java:597)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.container.session.stateless.StatelessSessionFactory.localCall(StatelessSessionFactory.java:161)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.container.session.SessionFactory.rpcInvoke(SessionFactory.java:237)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.rpc.rmi.server.RMIServerRPCImpl.getEJBResponse(RMIServerRPCImpl.java:106)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.rpc.rmi.client.RMIClientRPC.sendEJBRequest(RMIClientRPC.java:105)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.proxy.client.ClientRPCInvocationHandler.invoke(ClientRPCInvocationHandler.java:195)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.easybeans.proxy.client.ClientRPCInvocationHandler.invoke(ClientRPCInvocationHandler.java:111)
>>>>>>>>>         at $Proxy62.returnMessage(Unknown Source)
>>>>>>>>>         at
>>>>>>>>> be.sso.servlet.CalculateServlet.doGet(CalculateServlet.java:40)
>>>>>>>>>         at
>>>>>>>>> javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
>>>>>>>>>         at
>>>>>>>>> javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.jonas.web.tomcat6.CheckOpenResourcesValve.invoke(CheckOpenResourcesValve.java:73)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.jonas.web.tomcat6.tx.TransactionValve.invoke(TransactionValve.java:90)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.ow2.jonas.web.tomcat6.ResetAuthenticationValve.invoke(ResetAuthenticationValve.java:95)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
>>>>>>>>>         at
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
>>>>>>>>>         at java.lang.Thread.run(Thread.java:619)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 9 August 2011 10:45, Guillaume Sauthier (OW2)
>>>>>>>>> <[email protected]>  wrote:
>>>>>>>>>> Can't you rely on container's injection (@EJB) ?
>>>>>>>>>> --G
>>>>>>>>>>
>>>>>>>>>> 2011/8/9 Stefaan Somers<[email protected]>
>>>>>>>>>>> Hi all,
>>>>>>>>>>>
>>>>>>>>>>> I need to change the remote jndi-name of a Stateless Session
>>>>>>>>>>> Bean
>>>>>>>>>>> .
>>>>>>>>>>> Default the naming for jonas is :
>>>>>>>>>>>
>>>>>>>>>>> SessionBean.class.getName()
>>>>>>>>>>> + "_" + SessionBeanInterface.class.getName() + "@Remote"
>>>>>>>>>>>
>>>>>>>>>>> How can I change this. If I add the attribute mappedName in
>>>>>>>>>>> the
>>>>>>>>>>> @Stateless-annotation, I cannot get to the Local Interface
>>>>>>>>>>> anymore.
>>>>>>>>>>> And I need to be able to get to both.
>>>>>>>>>>>
>>>>>>>>>>> Greetings,
>>>>>>>>>>>
>>>>>>>>>>> Stefaan Somers
>>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>