How to use JNDI with WAS (Web Spehere Application Server 8.5.5) - jndi

Haven't really used Web Sphere Application Server (8.5.5) before neither I have any actual experience with JNDI alltogether and I have even been working with Shiro only for couple of days.
Still I would need to get a custom Shiro-realm to the JNDI so that both the application and the Shiro would share a common instance of the realm (and so that the realm would have access to ejb-resources via inject)
This is how I have done this so far:
WEB-INF/shiro.ini
[main]
realmFactory = org.apache.shiro.realm.jndi.JndiRealmFactory
realmFactory.jndiNames = realms/ShiroRealm
...
A custom Shiro-Realm (just mocks for now)
import javax.faces.bean.SessionScoped;
#SessionScoped
public class MockRealm extends AuthorizingRealm implements Serializable {
#Inject public UserMB user;
#Override protected AuthenticationInfo doGetAuthenticationInfo(...) ...
#Override protected AuthorizationInfo doGetAuthorizationInfo(...) ...
}
A custom CredentialsMatcher
public class MockCredentialsMatcher implements CredentialsMatcher {
#Override public boolean doCredentialsMatch(...) ...
}
And I have a shiro-startup class as follows
#Singleton
#Startup
public class ShiroStartup {
#Inject
private MockRealm realm;
#PostConstruct
public void setup() {
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
InitialContext ic = new InitialContext(env);
try {
Object obj = ic.lookup("realms/ShiroRealm"); // This is expected to fail when the application is published
} catch (NamingException ne) {
this.realm.setCredentialsMatcher(new MockCredentialsMatcher());
ic.rebind("realms/ShiroRealm", this.realm);
System.out.println("Bound: realms/ShiroRealm";
}
} catch (NamingException e) {
e.printStackTrace();
}
}
}
I found a post earlier that suggest to do bridge the injection-scopes this way and actually this works, but only when this code is run on GlassFish (v4).
I'm pretty sure this should also work with WAS 8.5.5, but can't resolve this error. (maybe trivial to someone, but ...)
The error I get is a complain that the jndi name "realms/ShiroRealm" is not found / can not be used. (I'll post the exact Exception later, currently having trouble running the server at all)
I have not found how the name should be given (and this is starting to take time, even that I'd expect this kind of information would be easy to find), so I post in here in hopes that some one could advice me.
(Note: I copied here only the parts I thought relevant. When debugging the code when run on GlassFish, I get hits in all correct places when expected)
// Update (for completeness, though I do not think these are relevant for this question)
The contents of beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
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://docs.jboss.org/cdi/beans_1_0.xsd">
<interceptors>
<class>com.example.interceptor.ShiroSecuredInterceptor</class>
</interceptors>
</beans>
The contents of 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_1.xsd"
version="3.1">
<interceptors>
<interceptor>
<interceptor-class>com.example.interceptor.ShiroSecuredInterceptor</interceptor-class>
</interceptor>
</interceptors>
<assembly-descriptor>
<interceptor-binding>
<ejb-name>*</ejb-name>
<interceptor-class>com.example.interceptor.ShiroSecuredInterceptor</interceptor-class>
</interceptor-binding>
</assembly-descriptor>
</ejb-jar>
The constents of web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID"
version="3.1">
<display-name>shiroTest</display-name>
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
<welcome-file-list>
<welcome-file>Login.xhtml</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
// UPDATE
finally got the server back online and was able to get the Exception thrown
[4/17/15 12:16:22:053 EEST] 00000043 SystemErr R javax.naming.NameNotFoundException: Context: securityoffNode01Cell/nodes/securityoff/servers/server1, name: realms/ShiroRealm: First component in name realms/ShiroRealm not found. [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]
Incase the full stack trace is important, I put it on the pastebin for a while.
http://pastebin.com/sANAqCJL
(Realized that the project that I used to test this configuration on GlassFish is a simple 'war'-project where the actual implementation deployed on WAS is in ear. May or may not be relevant between these servers.)
// UPDATE 2
After reading this (not completely yet, still reading and testing):
http://www-01.ibm.com/support/knowledgecenter/SS7JFU_7.0.0/com.ibm.websphere.express.iseries.doc/info/iseriesexp/ae/cejb_bindingsejbfp.html
I tried using a name: "ejblocal:MockRealm".
Well, this seems to be ok for it. However continued with this same issue, the following Exception is now.
[4/17/15 13:17:47:536 EEST] 000000ac webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor]: java.lang.IllegalStateException: Unable to look up realm with jndi name 'ejblocal:MockRealm'.
It looks like the jndi name used in shiro.ini still needs to fixed something else, but the 'ejbLocal:MockRealm" or "simply "MockRealm" is not ok.
I hope to find solution soon, I will post a real answer then.

Have you tried removing the "env" parameter that you're passing here?
//InitialContext ic = new InitialContext(env); //OLD
InitialContext ic = new InitialContext(); //NEW
The reason is that when Shiro attempts to lookup '"realms/ShiroRealm' it is going to do it with an InitialContext with no environment parameters.
If the environment you've defined is required you will have to create a RealmFactory that provides the same property to Shiro.
package com.acme.realm.jndi;
import java.util.Properties;
import javax.naming.Context;
public class WASJndiRealmFactory extends JndiRealmFactory {
#Override
public void setJndiNames (String commaDelimited) throws IllegalStateException {
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
setJndiEnvironment(p);
super.setJndiNames(commaDelimited);
}
}
Then you will have to update your 'shiro.ini' to reference the new RealmFactory.
[main]
realmFactory = com.acme.realm.jndi.WASJndiRealmFactory

I occured to browse this a bit dated question.
I could not configure the Shiro so that it worked with WAS. Instead I put manually the common data that both "scopes" needed into the JNDI context.
This way I was able to lookup in Shiro the things that were needed from the actual application.
With this solution the ShiroStartup was no longer needed.

Related

Calling static method from JSF page [duplicate]

Im new to JSF 2. My question is related to BalusC's answer to this question jsf2 ajax update parts based on request parameters I tried the kickstart code BalusC posted and I encountered an EL parsing error:
/nameofpage.xhtml #12,64 rendered="#{bean.panels.contains('u1')}"
Error Parsing: #{bean.panels.contains('u1')}
I guess that this is caused because I'm not running a Servlet 3.0 / EL 2.2 capable container with a /WEB-INF/web.xml declared as per Servlet 3.0 spec. I'm using Tomcat 6.
BalusC suggested in his answer to create a custom EL function. But how do I accomplish this using a custom EL function? Or can this be fixed by just configuring certain parts of my project?
Below is my web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
First create a final class with a public static method which does exactly the job you want:
package com.example;
import java.util.Collection;
public final class Functions {
private Functions() {
// Hide constructor.
}
public static boolean contains(Collection<Object> collection, Object item) {
return collection.contains(item);
}
}
Then define it as a facelet-taglib in /WEB-INF/functions.taglib.xml:
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
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/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://example.com/functions</namespace>
<function>
<function-name>contains</function-name>
<function-class>com.example.Functions</function-class>
<function-signature>boolean contains(java.util.Collection, java.lang.Object)</function-signature>
</function>
</facelet-taglib>
Then familarize Facelets with the new taglib in the existing /WEB-INF/web.xml:
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/functions.taglib.xml</param-value>
</context-param>
(note: if you already have the javax.faces.FACELETS_LIBRARIES definied, then you can just add the new path semicolon separated)
Then define it in the Facelets XHTML file as new XML namespace:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:func="http://example.com/functions"
...
>
Finally you can use it as intended:
rendered="#{func:contains(bean.panels, 'u1')}"
As a completely different alternative, you can also include JBoss EL in your project. It works on Tomcat 6.0 and you'll be able to invoke non-getter methods in EL. Drop jboss-el.jar file in /WEB-INF/lib and add the following to your web.xml:
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
Since EL 2.2 there's another approach: create an #ApplicationScoped bean with methods in turn referring to those static functions. See also a.o. Utility methods in application scoped bean.

can we move some swagger configuration from web.xml

In swagger 1.2.9-1.2.3 or old versions we have config reader com.wordnik.swagger.jaxrs.ConfigReader class, we can extend this class and we can declare swagger properties swagger.api.basepath , api.version , swagger.version etc.
But in current version of swagger 2.10-1.3.0 this class is not present. Is there any way we can move above configurations from web.xml, I want to have them in property file instead of hard coding it in web.xml.
Thanks in advance.
There's a thread explaining how to do this on the Swagger google group.
Basically, in Swagger 1.3, you need to use the SwaggerConfig class, like so:
SwaggerConfig config = new SwaggerConfig();
config.setBasePath(yourBasePathVariable);
ConfigFactory.setConfig(config);
However, you need this to occur after Swagger loads and sets the default basePath, because otherwise (if your basePath gets set first) it will be overwritten.
Here is how you can move swagger configuration to a customization code
This is particularly helpful if you are hosting your micro service on cloud foundry or IBM Bluemix or Some PaaS Cloud solution
Dependency in your pom.xml
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-jersey2-jaxrs</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
Swagger configuration
package com.ibm.api;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import io.swagger.jaxrs.config.BeanConfig;
import io.swagger.jaxrs.config.DefaultJaxrsConfig;
public class SwaggerConfigReader extends DefaultJaxrsConfig {
/**
*
*/
private static final long serialVersionUID = 1638783798880874518L;
#Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//contextPath will be null for host2 and /xyz for host1.
String contextPath = config.getServletContext().getContextPath();
BeanConfig beanConfig = new BeanConfig();
beanConfig.setVersion("1.0.0");
beanConfig.setTitle(Result.IMPLEMENTATION + " API Documentation");
beanConfig.setSchemes(new String[] {
"http", "https"
});
beanConfig
.setResourcePackage("com.ibm.api");
beanConfig.setBasePath(contextPath + "/rest");
beanConfig.setScan(true);
}
}
Web.xml entries
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restful Web Application</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>io.swagger.jaxrs.listing,com.ibm.api</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SwaggerBootstrap</servlet-name>
<servlet-class>com.ibm.api.SwaggerConfigReader</servlet-class>
<init-param>
<param-name>scan.all.resources</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
</web-app>
Note the com.ibm.api.SwaggerConfigReader registered as swagger configuration and com.ibm.api registered in packages to be scanned for rest APIs. Also note beanConfig.setBasePath(contextPath + "/rest");
Now your swagger.JSON configuration will show up as http://localhost:8080/jax_rs/rest/swagger.json. Point swagger UI to this URL and you will see swagger documentation.
The code is here: https://github.com/sanketsw/jax_rs_REST_Example

Spring PageNotFound and URLMapping in web.xml

I have been reading a lot of questions like this, but I'm not getting out of the trouble, and I'm starting to think that the problem is tomcat playing around.
First of all, here are my web.xml, my *-servlet.xml and my controller.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>Spring REST Server</display-name>
<description>Spring REST Server</description>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:env/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:config/applicationContext.xml
classpath:config/kimboo-servlet.xml
</param-value>
</context-param>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>Kimboo</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring MVC Dispatcher Servlet -->
<servlet>
<servlet-name>kimboo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:config/applicationContext.xml
classpath:config/kimboo-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>kimboo</servlet-name>
<url-pattern>/home/</url-pattern>
</servlet-mapping>
</web-app>
This is my kimboo-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="ar.com.kimboo.server.ui.controller" />
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/AppClient/pages/" />
<property name="suffix" value=".html" />
</bean>
And this is my controller
#Controller
#RequestMapping(value = "/home")
public class HomeController {
#RequestMapping(value = "/")
public String home() {
return "login";
}
#RequestMapping(value = "/main")
public String main() {
return "main";
}
#RequestMapping(value = "/about")
public String main() {
return "about";
}
}
This is a pretty simple example, I don't know why isn't working. I have readed a lot of questions like this, here and in another sites, I don't know what I'm missing.
By the way, in the controller I tried all the convinations to match the url; put "/home/" or "home/" at the class level, and put "login" or "main" at method level.
The only thing that works is when I hit localhost:8080/myServer/home/. I tried using "/home/" in the url-pattern of the web.xml instead "/home/". I also tried use "/" and "/", but is the same.
The only way that this works is when in the url-pattern of the web.xml I use
<url-pattern>/home/</url-pattern>
<url-pattern>/home/main/</url-pattern>
<url-pattern>/home/login/</url-pattern>
Then I can hit all the url's. I don't know what to do, maybe this is a tomcat 7 problem?
you were not configured mapping for controller and annotation handler.Add this below bean configuration in the kimboo-servlet.xml and also add the respective jars.It may work.
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/home/**=homeController
</value>
</property>
</bean>
Rather than this being a TomCat problem I suspect this is a problem with how you have annotated the controller. Please replace your controller annotations as follows
#Controller
public class HomeController {
#RequestMapping(value = "/home")
public String home() {
return "login";
}
#RequestMapping(value = "/home/main")
public String main() {
return "main";
}
#RequestMapping(value = "home/about")
public String main() {
return "about";
}
}
This is only a guess. Sorry if I got it wrong. I remember seeing this problem in REST services. Maybe its the same.Dont have time to test it myself now.
Look at this question: Basic Spring MVC config: PageNotFound using InternalResourceViewResolver. The reason is your mapping which is too wide and interfere to JspServlet mapping.

glassfish 3.1 jdni lookup on EJB3

I have the following Interfaces MyLocalBean, MyRemoteBean and the stateless MyBean implements MyLocalBean, MyRemoteBean
Which of the following i don't need to get a simple java application to test this ...
ejb-jar.xml, glassfish-ejb-jar.xml, gf-client.jar
Here's ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
<enterprise-beans>
<session>
<ejb-name>MyEJB</ejb-name>
<home>test.ejb.MyLocalBean</home>
<remote>test.ejb.MyRemoteBean</remote>
<ejb-class>test.ejb.MyBean </ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
what's missing here? would i be able to lookup using MyEJB?
and here's my lookup code
InitialContext ic;
ic = new InitialContext();
MyRemoteBean remoteBean =
(MyRemoteBean ) ic.lookup("java:comp/env/MyEJB");
[EDIT]
I've update the ejb-jar.xml as follows
<enterprise-beans>
<session>
<ejb-name>MyEJB</ejb-name>
<ejb-class>test.ejb.MyBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>MyEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>test.ejb.MyLocalBean</local>
<ejb-link>MyEJBClient.jar#MyEJB</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
I get an error ...
cannot Deploy MyBeanEAR
Deployment Error for module:
MyBeanEAR: Error occurred
during deployment: Exception while
deploying the app [MyBeanEAR] :
Error: Unresolved :
MyEJBClient.jar#MyEJB.
Please see server.log for more
details.
[\EDIT]
[EDIT]
Hi bkail, let me brake down the problem using the correct names.. Initially, this is what my eclipse-sts IDE created by default
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
<display-name>BatchOverrideEJB</display-name>
<ejb-client-jar>BatchOverrideEJBClient.jar</ejb-client-jar>
</ejb-jar>
and this is how i tried accessing the EJB
Properties p = new Properties();
p.put("org.omg.CORBA.ORBInitialHost","localhost");
p.put("org.omg.CORBA.ORBInitialPort","3700");
InitialContext ctx = new InitialContext(p);
ic = new InitialContext(p);
BatchOverrideManagerRemote batchOverrideRemote =
(BatchOverrideManagerRemote) ic.lookup("java:comp/env/BatchOverrideEJB");
running this i got the following error
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at za.co.sanlam.batchovveride.test.BatchOverrideTester.main(BatchOverrideTester.java:33)
I thought this error meant that my EJB its not bound to the context, so i modified the ejb-jar.xml as follows
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
<enterprise-beans>
<session>
<ejb-name>BatchOverrideEJB</ejb-name>
<ejb-class>com.test.ejb.BatchOverrideManagerBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>BatchOverrideEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>com.test.batchoverridemanager.ejb.BatchOverrideManagerLocal</local>
<ejb-link>BatchOverrideEJB</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
</ejb-jar
but now i get javax.naming.NameAlreadyBoundException: Use rebind to override
[/EDIT]
Try <ejb-link>MyEJB</ejb-link>. That said, test.ejb.MyLocalEJB doesn't sound like a home interface that extends EJBHome, so perhaps you meant to use <business-remote> rather than <remote> and <home>? If you're using a container that supports EJB 3.1, you'll probably find it easier to just use annotations:
#Stateless
public class MyBean implements MyLocal { ... }
#Local
public interface MyLocal { ... }
#Remote
public interface MyRemote { ... }
As an aside MyLocalBean and MyRemoteBean are unusual names for business interfaces. Typically, the Bean suffix is reserved for the EJB class itself.
Edit #2:
For the second edit, see this link:
http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#nonJavaEEwebcontainerRemoteEJB

Struts2 combine with domain specific servlet

I have struts2 web application. Right now I need embed with help of iframe some functionality from stand-alone servlet.
But according to following rule, servlet is never get calling.
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Unfortunately I cannot change it to /prefix/*
So does anybody know how to resolve it?
Filters are called in the order as they're definied in web.xml. I'd create a filter with a more specific url-pattern in the front of the Struts2 filter and then let this filter forward the request to the servlet in question instead of continuing the filter chain. E.g.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
request.getRequestDispatcher("/servletURL").forward(request, response);
}
Map this on the same url-pattern as the servlet, i.e. /servletURL and put it before the Struts2 filter in the web.xml.
Try looking at this: Struts 2 Web XML
There is a question: "Why the Filter is mapped with /* and how to configure explicit exclusions (since 2.1.7)" which should ideally help. In theory you should be able to put your exception in this list, and map your servlet normally.
I won't comment on this design decision for the Struts 2 folks.
We are doing this with struts 2.1.6 defining the struts filter like this:
<filter><!-- struts filter -->
<filter-name>strutsFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>strutsFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
And our other Servlets like this:
<servlet-mapping>
<servlet-name>SomeOtherServlet</servlet-name>
<url-pattern>*.yo</url-pattern>
</servlet-mapping>

Resources