0
votes

I'm fairly new with WebSphere (mainly worked with Tomcat) and am trying to host a Struts/Spring/Hibernate website. The website is supposed to be able to look up data from an Oracle database and display that information.

I'm currently not able to get the website running and it seems to be a jndi error. Here is the error:

[ERROR   ] Context initialization failed
Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is javax.naming.NamingException: CWNEN1001E: The object referenced by the java:comp/env/jdbc/test JNDI name could not be instantiated. If the reference name maps to a JNDI name in the deployment descriptor bindings for the application performing the JNDI lookup, make sure that the JNDI name mapping in the deployment descriptor binding is correct. If the JNDI name mapping is correct, make sure the target resource can be resolved with the specified name relative to the default initial context. [Root exception is com.ibm.wsspi.injectionengine.InjectionException: CWNEN0030E: The server was unable to obtain an object instance for the java:comp/env/jdbc/test reference.  The exception message was: CWNEN1003E: The server was unable to find the jdbc/test binding with the javax.sql.DataSource type for the java:comp/env/jdbc/test reference.]
[ERROR   ] SRVE0283E: Exception caught while initializing context: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is javax.naming.NamingException: CWNEN1001E: The object referenced by the java:comp/env/jdbc/test JNDI name could not be instantiated. If the reference name maps to a JNDI name in the deployment descriptor bindings for the application performing the JNDI lookup, make sure that the JNDI name mapping in the deployment descriptor binding is correct. If the JNDI name mapping is correct, make sure the target resource can be resolved with the specified name relative to the default initial context. [Root exception is com.ibm.wsspi.injectionengine.InjectionException: CWNEN0030E: The server was unable to obtain an object instance for the java:comp/env/jdbc/test reference.  The exception message was: CWNEN1003E: The server was unable to find the jdbc/test binding with the javax.sql.DataSource type for the java:comp/env/jdbc/test reference.]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:336)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:750)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:2374)
    at [internal classes]
Caused by: javax.naming.NamingException: CWNEN1001E: The object referenced by the java:comp/env/jdbc/test JNDI name could not be instantiated. If the reference name maps to a JNDI name in the deployment descriptor bindings for the application performing the JNDI lookup, make sure that the JNDI name mapping in the deployment descriptor binding is correct. If the JNDI name mapping is correct, make sure the target resource can be resolved with the specified name relative to the default initial context. [Root exception is com.ibm.wsspi.injectionengine.InjectionException: CWNEN0030E: The server was unable to obtain an object instance for the java:comp/env/jdbc/test reference.  The exception message was: CWNEN1003E: The server was unable to find the jdbc/test binding with the javax.sql.DataSource type for the java:comp/env/jdbc/test reference.]
    at com.ibm.ws.injectionengine.osgi.internal.naming.InjectionJavaColonHelper.newCannotInstantiateObjectException(InjectionJavaColonHelper.java:134)
    at [internal classes]
    at javax.naming.InitialContext.lookup(Unknown Source)
    at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
    at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179)
    at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
    at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:106)
    at org.springframework.jndi.JndiObjectTargetSource.afterPropertiesSet(JndiObjectTargetSource.java:97)
    at org.springframework.jndi.JndiObjectFactoryBean$JndiObjectProxyFactory.createJndiObjectProxy(JndiObjectFactoryBean.java:318)
    at org.springframework.jndi.JndiObjectFactoryBean$JndiObjectProxyFactory.access$000(JndiObjectFactoryBean.java:307)
    at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:200)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
    ... 24 more
Caused by: com.ibm.wsspi.injectionengine.InjectionException: CWNEN0030E: The server was unable to obtain an object instance for the java:comp/env/jdbc/test reference.  The exception message was: CWNEN1003E: The server was unable to find the jdbc/test binding with the javax.sql.DataSource type for the java:comp/env/jdbc/test reference.
    at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1087)
    ... 38 more
Caused by: com.ibm.wsspi.injectionengine.InjectionException: CWNEN1003E: The server was unable to find the jdbc/test binding with the javax.sql.DataSource type for the java:comp/env/jdbc/test reference.
    at com.ibm.ws.injectionengine.osgi.internal.IndirectJndiLookupObjectFactory.getObjectInstance(IndirectJndiLookupObjectFactory.java:201)
    ... 38 more

Here is my WebSphere server.xml

<server description="new server">   
    <featureManager continueOnError="false">
        <feature>localConnector-1.0</feature>
        <feature>servlet-3.0</feature>
        <feature>jsp-2.2</feature>
        <feature>jaxrs-1.1</feature>
        <feature>jndi-1.0</feature>
    </featureManager>
    <applicationMonitor updateTrigger="disabled"/>
    <application id="proxy" location="proxy.war" name="proxy" type="war">
    </application>
    <httpEndpoint id="defaultHttpEndpoint"
                  host="localhost"
                  httpPort="9080"
                  httpsPort="9443" />

    <dataSource id="oracle" jndiName="jdbc/test" type="javax.sql.DataSource">
        <jdbcDriver libraryRef="oracle-lib" id="oracle-driver"/>
        <connectionManager numConnectionsPerThreadLocal="10" id="ConnectionManager" minPoolSize="1"/>
        <properties.oracle user="test" password="test" URL="jdbc:oracle:thin:@test.local:1521:STILOG"/>
    </dataSource>

    <library id="oracle-lib">
        <fileset dir="C:/Users/test/workspace/WebAdmin/WebContent/WEB-INF/lib/" includes="ojdbc6.jar"/>
    </library>

    <application context-root="WebAdmin" id="WebAdmin" location="WebAdmin.war" name="WebAdmin" type="war">
        <classloader delegation="parentLast" commonLibraryRef="oracle-lib"/>
    </application>
</server>

applicationContext.xml

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <bean id="commonService" class="com.ddvc.service.CommonServiceImpl"/>
    <bean id="mainMenuService" class="com.ddvc.service.MainMenuServiceImpl"/>
    <bean id="storeFilterService" class="com.ddvc.service.StoreFilterServiceImpl"/>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean
                class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="ORACLE" />
                <property name="showSql" value="true" />
            </bean>
        </property>
        <property name="persistenceUnitName" value="pu1" />
        <property name="jpaProperties">
            <props>
                <prop key="org.hibernate.envers.store_data_at_delete">true</prop>
            </props>
        </property>
    </bean>

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
<!--             value>java:/comp/env/IVRConfig</value -->
<!--             value>IVRConfigCluster</value -->
            <value>java:comp/env/jdbc/test</value>
        </property>
        <property name="lookupOnStartup" 
            value="true"/>
        <property name="cache" 
            value="true"/>
        <property name="proxyInterface" 
            value="javax.sql.DataSource"/>
    </bean>

<!--     <jee:jndi-lookup id="dataSource" -->
<!--        jndi-name="java:comp/env/jdbc/test" -->
<!--        cache="true" -->
<!--        resource-ref="true" -->
<!--        lookup-on-startup="true" -->
<!--        proxy-interface="javax.sql.DataSource"> -->
<!--    </jee:jndi-lookup> -->

<!--    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> -->

<!--    <bean id="pum" -->
<!--         class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> -->
<!--         <property name="persistenceXmlLocations"> -->
<!--             <list> -->
<!--                 <value>classpath:META-INF/persistence.xml</value> -->
<!--             </list> -->
<!--         </property> -->
<!--         <property name="defaultDataSource" ref="dataSource"></property> -->
<!--     </bean> -->

<!--    <bean id="emf-p" -->
<!--        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> -->
<!--        <property name="persistenceXmlLocation" value="/WebContent/META-INF/persistence.xml" /> -->
<!--        <property name="persistenceUnitManager" ref="pum"/> -->
<!--        <property name="persistenceUnitName" value="pu1" /> -->
<!--        <property name="loadTimeWeaver"> -->
<!--            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> -->
<!--        </property> -->
<!--    </bean> -->

    <bean id="transactionManager"
        class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="loginAction" scope="prototype" class="com.ddvc.action.LoginAction">
        <constructor-arg ref="commonService" />
    </bean>

    <bean id="userAction" scope="prototype" class="com.ddvc.action.UserAction">
        <constructor-arg ref="commonService" />
    </bean>

    <bean id="mainMenuAction" scope="prototype" class="com.ddvc.action.MainMenuAction">
        <constructor-arg ref="mainMenuService" />
    </bean>  
</beans>

ibm-web-bnd.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-bnd 
    xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd"
    version="1.0">

    <virtual-host name="default_host" />

    <resource-ref name="jdbc/test" binding-name="jdbc/test"/>
</web-bnd>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" 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-app_2_5.xsd">

    <display-name>WebAdmin</display-name>

    <!-- Include this if you are using Hibernate -->
    <filter>
        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        <filter-class>
            org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <resource-ref>
        <description>DataSource</description>
        <res-ref-name>jdbc/test</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
        <mapped-name>jdbc/test</mapped-name>
    </resource-ref>
</web-app>

It was suggested to try that <jee:jndi-lookup id="dataSource">, and I got it hooked up. But it acted the exact same way as the <bean id="dataSource">.

1
Try to add <feature>jdbc-4.0</feature> to your server.xml, you are missing it. - Gas
When I add <feature>jdbc-4.0</feature> I get the following error: [ERROR ] CWWKF0001E: A feature definition could not be found for jdbc-4.0`. - user3058866
You must be doing some typo. Do you have WebSphere Developer Tools installed in Eclipse? If yes then add that feature using Server configuration editor. You should add it to featureManager section with other features. You can also run command from wlp\bin\productInfo featureInfo to see if you have that feature in the runtime. - Gas
I am currently just using the Web Preview Server for WebSphere in Eclipse. There doesn't seem to be any featureManager option on this server. And I'm unsure where to run the wlp\bin\productInfo command for this server. I've just been editing the C:\Users\user\workspace\.metadata\.plugins\com.ibm.etools.wdt.server.core\tmp0\usr\servers\defaultServer0\server.xml file directly to add the connection information and features. - user3058866
I currently have the IBM Installation Manager downloaded and am trying to download the WebService files needed to install it (www-01.ibm.com/support/docview.wss?uid=swg24034969), but I'm not sure that I'm downloading the right files. I'm currently downloading these two files 8.5.5-WS-WAS-RP-part1.zip and 8.5.5-WS-WAS-RP-part2.zip. Will try and extract them and hopefully the have what I need for the IBM IM repository to install it correctly. - user3058866

1 Answers

0
votes

This is not correct way to do it. Do as follows:

  1. In Eclipse, go to Help > Eclipse Marketplace
  2. Search for ibm liberty, you will find - WebSphere Application Server Liberty Profile Developer tools for Luna (or other Eclipse version you are using). Install the tools.
  3. After installation, you will be able to create new server - WebSphere Application server Liberty Profile - create it. The Web Preview you were trying to use is for static files, not Java EE applications.
  4. In the wizard creating server you will have option to download server runtime, do it. You can also download it manually from wasdev.net:

  5. Add your application to the server. In the Servers view, expand Liberty server and double click Server configuration. You will have feature manager there, and you will be able to add jdbc there.