Results 1 to 3 of 3

Thread: JNDI lookup problem Spring2.5. EJB3 on Jboss4.2

  1. #1
    Join Date
    Mar 2010
    Location
    PARIS
    Posts
    10

    Post JNDI lookup problem Spring2.5. EJB3 on Jboss4.2

    Environnement
    -Jboss 4.2x + HSQL database
    -spring 2.5.6
    -EJB3



    My test client in Java bellow . I've checked the jndi list on my jboss 4.2x but i can't figure out why spring cannot bind the EJB context using the (jndi jee:jndi-lookup tag)

    My exception raised on main program is javax.naming.NameNotFoundException . I think it because the biding isn't done by Spring . What did I miss ? Is there something to add on Jboss 4.2 ?

    Caused by: javax.naming.NameNotFoundException: com.ejb.service.CustomerServiceImpl not bound

    TEST CLIENT CODE

    Code:
    import javax.naming.Context; import javax.naming.InitialContext;
    
    import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.ejb.domain.Customer; import com.spring.service.CustomerManager;
    
    public class SpringAndEJBMain { private static Context context;
    public static void main(String[] args) {
    
        try {       
            Context context = new InitialContext();
            context.lookup("CustomerServiceImpl/remote");
            CustomerService stock = (CustomerService) context.lookup("CustomerServiceImpl/remote");
    
             ApplicationContext contextSpring =
                     new ClassPathXmlApplicationContext("SpringXMLConfig.xml");
    
             CustomerManager service = (CustomerManager) contextSpring.getBean("manageCustomer");
             Customer customer = new Customer();
             customer.setFirstName("Meera");
             customer.setLastName("Subbarao");
             customer.setMiddleName("B");
             customer.setEmailId("meera@springandejb.com");
             customer.setCustomerId(new Long(1));
    
             service.addCustomer(customer);
             for (Customer cust : service.listCustomers()) {
                 System.out.println(cust.getFirstName());
                 System.out.println(cust.getLastName());
                 System.out.println(cust.getMiddleName());
                 System.out.println(cust.getEmailId());
    
             }
             service.removeCustomer(new Long(1));
    
        }
        catch (Exception e) {
             e.printStackTrace();
          }
    
    }
    
    }
    JNDI TREE on Jboss 4.2

    +- CustomerServiceImpl (class: org.jnp.interfaces.NamingContext)
    | +- remote (proxy: $Proxy103 implements interface com.ejb.service.CustomerService,interface org.jboss.ejb3.JBossProxy)


    Code:
    package com.ejb.service;
    
    import java.util.Collection;
    
    import javax.ejb.Remote;
    
    import com.ejb.domain.Customer;
    
    @Remote public interface CustomerService {
    
    Customer create(Customer info);
    
    Customer update(Customer info);
    
    void remove(Long customerId);
    
    Collection<Customer> findAll();
    
    Customer[] findAllAsArray();
    
    Customer findByPrimaryKey(Long customerId);
    
    }
    
    
    package com.ejb.service;
    
    import com.ejb.domain.Customer; import java.util.Collection; import javax.ejb.Stateless; import javax.interceptor.Interceptors; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.jws.WebMethod;
    
    @WebService(name = "CustomerService", serviceName = "CustomerService", targetNamespace = "urn:CustomerService") @SOAPBinding(style = SOAPBinding.Style.RPC) @Stateless(name = "CustomerServiceImpl") public class CustomerServiceImpl implements CustomerService {
    
    @PersistenceContext(name="Customer")
    private EntityManager manager;
    
    @WebMethod
    public Customer create(Customer info) {
        this.manager.persist(info);
        return info;
    }
    
    @WebMethod
    public Customer update(Customer info) {
        return this.manager.merge(info);
    }
    
    @WebMethod
    public void remove(Long customerId) {
        this.manager.remove(this.manager.getReference(Customer.class, customerId));
    }
    
    public Collection<Customer> findAll() {
        Query query = this.manager.createQuery("SELECT c FROM Customer c");
        return query.getResultList();
    }
    
    @WebMethod
    public Customer[] findAllAsArray() {
        Collection<Customer> collection = findAll();
        return (Customer[]) collection.toArray(new Customer[collection.size()]);
    }
    
    @WebMethod
    public Customer findByPrimaryKey(Long customerId) {
        return (Customer) this.manager.find(Customer.class, customerId);
    }
    
    }

    Code:
    <persistence>
       <persistence-unit name="Customer">
       	 <class>com.ejb.domain.Customer</class>
          <jta-data-source>java:/DefaultDS</jta-data-source>
          <properties>
          	 <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
             <property name="hibernate.hbm2ddl.auto" value="update"/>
          </properties>
       </persistence-unit>
    </persistence>
    Spring configuration
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:jee="http://www.springframework.org/schema/jee"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
           
           
           
    	<!-- Use a custom JNDI bean factory configured not to prepend lookups with 
    		"java:comp/env" -->
    	<bean id="jndiFactory" class="org.springframework.jndi.support.SimpleJndiBeanFactory">
        	<property name="resourceRef" value="false" />
    	</bean>
    
    	<!-- Configure the CommonAnnotationBeanPostProcessor to always use JNDI 
    		lookup (for EJBs) and use the custom JNDI bean factory above. -->
    	<bean
    		class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
    		<property name="alwaysUseJndiLookup" value="true" />
    		<property name="jndiFactory" ref="jndiFactory" />
    	</bean>
    
    
    	<jee:jndi-lookup id="customerService"
    		jndi-name="com.ejb.service.CustomerServiceImpl">
    	</jee:jndi-lookup>
    
    
    
    	<bean id="manageCustomer" class="com.spring.service.CustomerManagerImpl">
    		<property name="customerService" ref="customerService" />
    	</bean>
    </beans>
    jndi properties
    java.naming.factory.initial=org.jnp.interfaces.Nam ingContextFactory
    java.naming.factory.url.pkgs=org.jboss.naming:org. jnp.interfaces
    java.naming.provider.url=localhost:1099


    Full Stack Trace :

    org.springframework.beans.factory.BeanCreationExce ption: Error creating bean with name 'customerService': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: com.ejb.service.CustomerServiceImpl not bound at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.initializeBean(Abstract AutowireCapableBeanFactory.java:1338) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.doCreateBean(AbstractAu towireCapableBeanFactory.java:473) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory$1.run(AbstractAutowireC apableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.createBean(AbstractAuto wireCapableBeanFactory.java:380) at

  2. #2
    Join Date
    Jun 2006
    Location
    The Netherlands
    Posts
    13,629

    Default

    For your manual lookup you use a different JNDI name as for Spring I suggest you start by fixing that. Which is also what your stacktrace indicates that your jndi name is wrong.
    Marten Deinum
    Java Consultant / Pragmatist / Open Source Enthousiast / Author


    Pro Spring MVC: With Web Flow
    Conspect

    Have you read the reference guide.
    Use the [ code ] tags, young padawan

  3. #3
    Join Date
    Mar 2010
    Location
    PARIS
    Posts
    10

    Default

    I figured it out , the correct configuration is :
    thanks for helping .

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schem...-beans-2.5.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schem...ontext-2.5.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">



    <!-- Use a custom JNDI bean factory configured not to prepend lookups with
    "java:comp/env" -->
    <bean id="jndiFactory" class="org.springframework.jndi.support.SimpleJndi BeanFactory">
    <property name="resourceRef" value="false" />
    </bean>

    <!-- Configure the CommonAnnotationBeanPostProcessor to always use JNDI
    lookup (for EJBs) and use the custom JNDI bean factory above. -->
    <bean
    class="org.springframework.context.annotation.Comm onAnnotationBeanPostProcessor">
    <property name="alwaysUseJndiLookup" value="true" />
    <property name="jndiFactory" ref="jndiFactory" />
    </bean>


    <!-- <jee:jndi-lookup id="customerService"
    jndi-name="com.ejb.service.CustomerServiceImpl">
    </jee:jndi-lookup> -->


    <jee:jndi-lookup id="customerService" jndi-name="CustomerServiceImpl/remote"
    lookup-on-startup="false" proxy-interface="com.ejb.service.CustomerService"></jee:jndi-lookup>

    <bean id="manageCustomer" class="com.spring.service.CustomerManagerImpl">
    <property name="customerService" ref="customerService" />
    </bean>
    </beans>

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •