`
luyuwww
  • 浏览: 96086 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jboss下配置jndi利用spring的IOC来获得

阅读更多

本来项目内用的是普通数据源.考虑没有分布式的数据访问.就使用了apache-commons-dbcp.但是后来项目内要加一个第三方的报表制作工具.该工具强制要求使用JNDI来获得连接(该死的)没办法.只有加了.显将配置步骤和一个错误做笔记如下:

1. 环境: windowsXp系统.使用的是jbossGA-4.2.2 sqlserver2000.
项目架构是 Spring+ibatis+struts.
2. 配置步骤1 . 由于jboss会自动查找server\default\deploy目录下的 **-ds.xml文件.并读取其中内容.来得到相应的DataSource,我的文件具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
     <datasources> 
     <local-tx-datasource>
           <jndi-name>jdbc/DataSource</jndi-name>
           <connection-url>jdbc:jtds:sqlserver://localhost:1433/fnx</connection-url>
           <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
           <user-name>sa</user-name>
           <password>1234</password>

          <metadata> 
          <type-mapping>MS SQLSERVER2000</type-mapping>
          </metadata>
          </local-tx-datasource>
</datasources>

配置步骤2 . (有部分内容来自网上) 由于使用spring来获取jndi.所以实现了FactoryBean, InitializingBean

get/set方法没加

 
public class DataSourceFactoryBean implements FactoryBean, InitializingBean {

 /** 缓存数据源对象 */
 private DataSource dataSource;
 /** 是否jndi数据源 */
 private boolean jndi;
 /** 数据源的名字(如果是jndi数据源) */
 private String jndiName;
 /** jdbc驱动类(非jndi的情况) */
 private String driverClassName;
 /** 数据库的url(非jndi的情况) */
 private String url;
 /** 用户名(非jndi的情况) */
 private String username;
 /** 密码(非jndi的情况) */
 private String password;

 public void afterPropertiesSet() throws Exception {
  if (this.isJndi()) {
   if (!org.springframework.util.StringUtils.hasText(this.jndiName)) {
    throw new IllegalArgumentException("jndiName is required");
   }
  } else {
   if (!org.springframework.util.StringUtils
     .hasText(this.driverClassName)) {
    throw new IllegalArgumentException(
      "driverClassName is required");
   }
   if (!org.springframework.util.StringUtils.hasText(this.url)) {
    throw new IllegalArgumentException("url is required");
   }
   if (!org.springframework.util.StringUtils.hasText(this.username)) {
    throw new IllegalArgumentException("username is required");
   }
   if (!org.springframework.util.StringUtils.hasText(this.password)) {
    throw new IllegalArgumentException("password is required");
   }
  }
  // 在初始化时就创建数据源
  this.createDataSource();
 }

 public Object getObject() throws Exception {
  DataSource ds = this.createDataSource();
  return ds;
 }

 public Class getObjectType() {
  return javax.sql.DataSource.class;
 }

 public boolean isSingleton() {
  return true;
 }

 protected DataSource createDataSource() {
  DataSource ds = this.dataSource;
  if (ds == null) {
   try {
    if (this.isJndi()) {
     ds = new JndiDataSourceSupport()
       .lookupDataSource(this.jndiName);
    } else {
     ds = new DriverManagerDataSource(driverClassName, url,
       username, password);
    }
   } catch (Throwable err) {
    throw new RuntimeException(err);
   }
  }
  this.dataSource = ds;
  return ds;
 }

 private class JndiDataSourceSupport extends JndiLocatorSupport {
  public DataSource lookupDataSource(String jndiName)
    throws NamingException {
   return (DataSource) super.lookup(jndiName,getObjectType());
  }
 }

}

 

配置步骤3.  spring的配置文件片段

 <bean id="dataSource" class="****&*#*****.dao.DataSourceFactoryBean">
     <property name="jndi" value="${jdbc.IS_JNDI}" />
     <property name="jndiName" value="${jdbc.jndiName}" />
     <property name="driverClassName" value="${jdbc.driverClassName}" />
  <property name="url" value="${jdbc.url}" />
  <property name="username" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
 </bean>
 
 <bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
   <list>
    <value>classpath:config/jdbc.properties</value>
   </list>
  </property>
 </bean>

 

设置步骤4 . jdbc.properties  

 

#false 为开发时候使用的传统datasource 。为true为使用jndi得到datasource。建议开发时候使用前者
jdbc.IS_JNDI=true
jdbc.jndiName=java:jdbc/DataSource

#sql
jdbc.driverClassName=net.sourceforge.jtds.jdbc.Driver
jdbc.url=jdbc:jtds:sqlserver://localhost:1433/fnx
jdbc.username=sa
jdbc.password=1234

 

 

设置步骤5  一些说明.上面绿色部分要相同.jndi的datasource采用的而是jdts.开始的时候总是有错.第一次无法的到连接.

 刷新后就可以得到连接.百思不得其解.经过查找发现自己大意了.没有吧jdts的jar放在jboss4.2.2GA\server\default\lib下面.解决和异常如下:

jboss jndi jtds sqlserver2000 第一次错误得不到连接.然后刷新页面就ok的问题.
    问题搞定.
   就是jar没加对.
   jdni属于容器的应该加在容器内.我们加载在项目内.当然第一次会出错.
   然后第二次项目内的jar就会加载到容器你.所以就可用了.
   应该在jboss4.2.2GA\server\default\lib 加数据库jar就可以了.

  错误异常如下:
   Throwable while attempting to get a new connection: null
org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: net.sourceforge.jtds.jdbc.Driver, url: jdbc:jtds:sqlserver://localhost:1433/fnx)
 at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:179)
 at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.createConnectionEventListener(InternalManagedConnectionPool.java:577)
 at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.getConnection(InternalManagedConnectionPool.java:262)
 at org.jboss.resource.connectionmanager.JBossManagedConnectionPool$BasePool.getConnection(JBossManagedConnectionPool.java:500)
 at org.jboss.resource.connectionmanager.BaseConnectionManager2.getManagedConnection(BaseConnectionManager2.java:341)
 at org.jboss.resource.connectionmanager.TxConnectionManager.getManagedConnection(TxConnectionManager.java:315)
 at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:396)
 at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:842)
 at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:88)
 at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:182)
 at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:322)
 at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:255)
 at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:102)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:210)
 at $Proxy56.getUserByPassword(Unknown Source)
 at com.thams.user.action.LoginAction.gotoLogin(LoginAction.java:43)
 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:585)
 at com.thams.framework.action.BaseAction.dispatchMethod(BaseAction.java:205)
 at com.thams.framework.action.BaseAction.execute(BaseAction.java:129)
 at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at com.thams.framework.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:58)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
 at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
 at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
 at java.lang.Thread.run(Thread.java:595)
Caused by: org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: net.sourceforge.jtds.jdbc.Driver, url: jdbc:jtds:sqlserver://localhost:1433/fnx
 at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.getDriver(LocalManagedConnectionFactory.java:290)
 at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:170)
 ... 50 more

 

分享到:
评论
1 楼 luyuwww 2008-08-06  
jndiObjectFactoryBean
方便灵活切换.开发时候使用jndi无法脱离容器调试.所以才写了那个类.哈哈哈.

相关推荐

    Spring开发流程.pdf

    Spring框架采用了XML配置文件来描述对象之间的依赖关系,通过Spring的IoC容器管理这些对象。文件中提到了一个XML文件spring-example.xml,它使用beans命名空间,定义了一个bean元素,用来创建HelloWorld类的实例。...

    JAVA开源项目合集中文电子书

    Spring 3.1的新特性部分涵盖了新特性的概述以及改进点,如基于注解的配置方式,类路径扫描和管理组件,以及与JSR-330标准注解的整合,提供了更灵活和方便的方式来配置Spring应用程序。 Hibernate中文文档部分则从...

    Jetty中文手册

    如何使用Spring来配置Jetty 如何使用XBean来配置Jetty 客户端 Asynchronous HTTP Client教程 日志 / 监控 如何配置Request Logs 如何配置自定义错误页面(Custom Error Pages) 配置Jetty Statistics(统计) 配置...

    activemq-rar-5.4.0.rar

    - `spring-core-3.0.3.RELEASE.jar`, `spring-beans-3.0.3.RELEASE.jar`:Spring框架的核心组件,负责IoC(控制反转)和DI(依赖注入)。 - `org.osgi.core-4.1.0.jar`:OSGi核心库,用于模块化Java应用程序,提供...

    J2EE双语大作业源代码_J2EE_

    这个系统可能整合了Spring框架,利用其IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)特性。 9. **Web容器和应用服务器**:为了运行J2EE应用,需要一个支持J2EE规范的Web容器或应用服务器,如...

    JAVA初学者学习路线

    **学习目标**:了解微服务架构模式,使用Spring Boot快速构建独立的服务单元,利用Spring Cloud实现服务治理。 - **核心知识点**: - Spring Boot自动配置与启动 - 微服务设计原则 - API网关、服务发现、配置...

    java程序员简历模版

    Spring是全面的企业级应用框架,包含IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)等功能。 13. **数据库技术**:熟悉MySQL和Oracle数据库,了解SQL和PL/SQL,能够...

    JAVA技术路线图.docx

    了解并能运用Struts1和2的配置、组件、标签库,Spring的IoC容器、MVC模式,以及Hibernate的持久化操作。 达到高级软件工程师水平,开发者需要熟悉一系列开源技术和框架,如工作流引擎、规则引擎、搜索引擎、缓存...

    (完整版)Java系统架构师面试题 (2).docx

    后端可以使用Ejb、Spring、IOC、AOP、JMS、JNDI、RMI等技术来实现。 4. 什么是SOA、ROA?谈谈两种技术的原理及合用场景 SOA(Service-Oriented Architecture)是一种软件架构风格,强调服务之间的松耦合和自治性。...

    成为Java高手需要注意的25个学习目标

    14. **应用服务器管理**:管理和配置J2EE应用服务器,如WebLogic,JBoss,利用其集群,连接池,分布式处理等功能,并能进行性能监控和调优。 15. **面向方面的编程**(AOP)和面向属性的编程(AAP):理解这两种...

    JAVA技术资料讲解

    12. **轻量级框架**:熟悉Spring、PicoContainer、Avalon等轻量级框架,特别是它们的依赖注入(IoC)和控制反转(DI)概念。 13. **J2EE技术**:掌握JNDI、JMS、JTA/JTS、JMX和JavaMail等企业级技术,了解如何在...

    学习Java语言的30个参考,让你坐拥别人之上的30个擦考

    - **Spring、PicoContainer**:了解IoC/DI的基本思想,掌握Spring框架的核心概念。 ### 15. J2EE服务 - **JNDI、JMS**:学习Java Naming and Directory Interface、Java Message Service的使用方法。 - **JTA、JMX*...

    java技术体系图

    ### Java技术体系概览 #### 一、Java程序员的基础与高级特性 - **高级特性**: - **反射**:动态获取类的信息并操作对象的能力。...这一路径对于Java开发者来说是逐步深入的过程,每个阶段都有其特定的目标和挑战。

    JAVA程序员您需要学习的25个标准

    13. **应用程序服务器管理**:能够管理和配置J2EE应用服务器,如WebLogic、JBoss,利用其提供的集群、连接池和分布式处理等功能。 14. **性能调优和安全**:了解性能监控、调优策略,以及JAVA安全模型,包括加密、...

    Java学习的30个目标

    熟悉WebLogic、JBoss等应用服务器的安装、配置和管理,支持高可用性和负载均衡。 #### 19. 面向切面编程(AOP) 学习AOP概念,掌握AspectJ或AspectWerkz等工具,实现代码的横切关注点分离。 #### 20. 日志、调度与...

    Java高级工程师必学内容

    熟练管理与配置J2EE应用程序服务器(如WebLogic、JBoss),以及集群、连接池、分布式事务处理,对于保证应用的高效运行至关重要。 #### 面向方面的程序设计与面向属性的程序设计 AOP(Aspect-Oriented Programming...

Global site tag (gtag.js) - Google Analytics