2014-10-10 155 views
2

我使用Spring 4.0.5和Hibernate 4將Spring 3.1 + Hibernate 4 Web應用程序遷移到Jboss 6.1服務器。我的問題,在原有的項目,在我的「applicationContext.xml中」存在這樣一個一個bean:將Spring 3.1遷移到Spring 4:org.springframework.web.context.support.ServletContextFactoryBean

<bean id="servletContext" class="org.springframework.web.context.support.ServletContextFactoryBean"/>

我的問題是,彈簧4 doesn't有圖書館了。我需要知道在Spring 4.0.5中是否存在一種等價的方式來定義這個bean。我真的貶低任何幫助可以給我。

這是怎麼看我的代碼,我使用ServletContext的豆:

public class Environment { 

    private Logs log;   

    private ServletContext context; 
    private Scheduler quartzSched; 
    private SocketPool socketPool; 
    private WorkerSocket workerSocket; 
    private SocketPoolFactory socketPoolFactory; 
    private JsonObject catalog; 
    private HashMap<String, Object> connections; 

    private TerminalDao terminalDao; 
    private TerminalItemDao terminalItemDao; 
    private UsuarioDao usuarioDao; 
    private PaymentSystemDao paymentSystemDao; 
    private MensajeDao mensajeDao; 
    private TransacDao transacDao; 
    private TermPaySysDao termPaySysDao; 
    private ComprobanteDao comprobanteDao; 
    private String paymentSystem; 


    public Environment(String paymentSystem, boolean setSchedulerFactoryBean) throws Exception { 
     super(); 
     this.paymentSystem = paymentSystem; 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
     Services services = (Services) ctx.getBean("Services");   
     this.catalog = services.getCatalog(); 
     this.connections = services.getConnections();  
     this.transacDao = (TransacDao) ctx.getBean("transacDao"); 
     this.terminalDao = (TerminalDao) ctx.getBean("terminalDao"); 
     this.usuarioDao = (UsuarioDao) ctx.getBean("usuarioDao"); 
     this.terminalItemDao = (TerminalItemDao) ctx.getBean("terminalItemDao"); 
     this.paymentSystemDao = (PaymentSystemDao) ctx.getBean("paymentSystemDao"); 
     this.mensajeDao = (MensajeDao) ctx.getBean("mensajeDao"); 
     this.termPaySysDao = (TermPaySysDao) ctx.getBean("termPaySysDao"); 
     this.comprobanteDao = (ComprobanteDao) ctx.getBean("comprobanteDao"); 


     if(setSchedulerFactoryBean) 
      this.quartzSched = (Scheduler) ctx.getBean("schedulerFactoryBean");; //OJO CON ESTO este deberia salir bien 

     JsonObject PS = catalog.get(paymentSystem).getAsJsonObject(); 

     if(PS.get("ConnectionType").getAsString().equals("SocketPool")){ 
      this.socketPool = (SocketPool) services.getConnections().get(paymentSystem+"_SocketPool"); 
      this.socketPoolFactory = (SocketPoolFactory) services.getConnections().get(paymentSystem+"_SocketPoolFactory");  
     }else { 
      this.socketPool = null; 
      this.socketPoolFactory = null;  
     } 
     this.workerSocket = null; 

     this.context = (ServletContext)ctx.getBean("servletContext"); //HERE I USE THE BEAN 
     this.log= new Logs(); 


    } 

在這裏我補充Services.java,這是我的類使用的ServletContext作爲參數。

package com.globalcca.pos_movil_tran.services; 

import java.io.File; 
import java.io.FileFilter; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Properties; 
import java.util.Set; 


import javax.servlet.ServletContext; 


import org.apache.commons.beanutils.ConvertUtils; 
import org.apache.commons.pool.impl.GenericObjectPool.Config; 

import org.springframework.beans.factory.annotation.Autowired; 

import com.globalcca.pos_movil_desc.modelo.Transac; 
import com.globalcca.posmovil.resourceManager.SocketPool; 
import com.globalcca.posmovil.resourceManager.SocketPoolFactory; 
import com.globalcca.posmovil.resourceManager.WorkerSocket; 
import com.globalcca.posmovil.util.DateConverter; 
import com.globalcca.posmovil.util.TransacConverter; 
import com.globalcca.posmovil.util.PaymentSystemConverter; 
import com.globalcca.pos_movil_desc.modelo.PaymentSystem; 
import com.globalcca.pos_movil_desc.modelo.Transac; 
import com.google.gson.JsonArray; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonObject; 
import com.google.gson.JsonParser; 
import com.google.gson.stream.JsonReader; 

public class Services { 

JsonObject catalog; 
static HashMap<String, Object> connections; 
static Config SocketPoolConfig = new Config(); 
private static Logs log = new Logs(); 
@Autowired ServletContext servletContext; 

public Services(ServletContext context) throws IOException{ 

    ConvertUtils.register(new DateConverter(), java.util.Date.class); 
    ConvertUtils.register(new TransacConverter(), Transac.class);    //Se arreglo TransacConverter 
    //ConvertUtils.register(new PaymentSystemConverter(), PaymentSystem.class); 

    FileFilter fileFilter = new FileFilter() { 
     public boolean accept(File file) { 
      return file.isDirectory(); 
     } 
    };  
    File dir = new File(context.getRealPath("/WEB-INF/classes/Adquiriente/")); 
    readSocketPoolProperties(context); 

    JsonObject catalog = new JsonObject(); 
    connections = new HashMap<String, Object>(); 
    JsonParser parser = new JsonParser(); 
    // This filter only returns directories 
    File[] files = dir.listFiles(fileFilter); 
    if (files == null) { 
     System.out.println("Either dir does not exist or is not a directory"); 
    } else { 
     for (int i=0; i<files.length; i++) 
     { 
      // Get path of directory 
      String dirpath = files[i].getAbsolutePath(); 
      String dirname = files[i].getName(); 
      String catalogPath = dirpath+"/Catalog.cfg"; 
      String ConnectionModuleConfigPath = dirpath+"/ConnectionModule.cfg"; 

      try{ 
       JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(catalogPath))); 
       JsonObject PaymentSystem = (JsonObject)parser.parse(reader);      
       catalog.add(dirname,PaymentSystem); 
       //initConnection(PaymentSystem,ConnectionModuleConfigPath,parser,dirname);  //Descomentar esto cuando tengamos las conexiones 
       log.info("Loading "+catalogPath+" Successful"); 
      } catch (FileNotFoundException e) { 
       log.error("Error parsing Catalog.cfg File"); 
      } 

     } 
     this.setCatalog(catalog); 
    } 
} 

public static void readSocketPoolProperties(ServletContext context){ 
    String SocketPoolProp = "/WEB-INF/classes/SocketPool.properties"; 
    Properties prop = new Properties(); 
    Boolean error = false; 
    try { 
     SocketPoolProp = context.getRealPath(SocketPoolProp); 
     prop.load(new FileInputStream(SocketPoolProp)); 
     SocketPoolConfig.maxIdle = Integer.parseInt(prop.getProperty("MaxIdle")); 
     SocketPoolConfig.maxActive = Integer.parseInt(prop.getProperty("MaxActive")); 
     SocketPoolConfig.minEvictableIdleTimeMillis = Long.parseLong(prop.getProperty("MinEvictableIdleTimeMillis")); 
     SocketPoolConfig.testOnBorrow = Boolean.parseBoolean(prop.getProperty("TestOnBorrow")); 
     SocketPoolConfig.maxWait = Long.parseLong(prop.getProperty("MaxWait")); 
    } catch (IOException e) { 
     log.error("Error Loading SocketPool.properties File"); 
     error = true; 
    } 

    if(error){ 
     log.info("Using Default Values for SocketPool config"); 
     SocketPoolConfig = new Config(); 
     SocketPoolConfig.maxIdle = SocketPool.DEFAULT_MAX_IDLE; 
     SocketPoolConfig.maxActive = SocketPool.DEFAULT_MAX_ACTIVE; 
     SocketPoolConfig.minEvictableIdleTimeMillis = SocketPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; 
     SocketPoolConfig.testOnBorrow = SocketPool.DEFAULT_TEST_ON_BORROW; 
     SocketPoolConfig.maxWait = SocketPool.DEFAULT_MAX_WAIT; 
    }else{ 
     log.info("Loading "+SocketPoolProp+" Successful"); 
    } 
} 

public static void initConnection(JsonObject PaymentSystem, String ConnectionModuleConfigPath, JsonParser parser,String PSName) { 

    JsonReader reader; 
    try { 
     reader = new JsonReader(new InputStreamReader(new FileInputStream(ConnectionModuleConfigPath))); 

    JsonObject ConnectionsConfig = (JsonObject)parser.parse(reader);      

    if(ConnectionsConfig.get("Type").getAsString().equals("SocketPool")){ 
     initSocketPool(PaymentSystem, ConnectionModuleConfigPath,parser,PSName, ConnectionsConfig); 
     log.info("Initialization of SocketPool Successful"); 

    }else if(ConnectionsConfig.get("Type").getAsString().equals("ServerSocket")){ 
     initServerSocket(PaymentSystem, ConnectionModuleConfigPath,parser,PSName, ConnectionsConfig); 
     log.info("Initialization of ServerSocket Successful"); 

    } 
    PaymentSystem.addProperty("ConnectionType", ConnectionsConfig.get("Type").getAsString()); 

    } catch (IOException e) { 
     log.error("Error Initializing Connections"); 
     log.error(e); 
    } 

} 


private static void initServerSocket(JsonObject PaymentSystem, String socketConfigPath, JsonParser parser,String PSName, JsonObject ConnectionsConfig) throws IOException{ 

    JsonObject address = ConnectionsConfig.getAsJsonObject("Connections"); 

    Set<Map.Entry<String, JsonElement>> map = address.entrySet(); 
    Iterator<Map.Entry<String, JsonElement>> iterator = map.iterator(); 
    int size = map.size(); 
    WorkerSocket [] sSockets = new WorkerSocket[size]; 

    for(int k = 0; k < size; k++) 
    { 
     String IP = iterator.next().getKey(); 
     int port = address.get(IP).getAsInt(); 
     sSockets[k] = new WorkerSocket(IP, port); 
     log.trace("Server Socket IP:"+IP+" Port:"+port+" Initialized"); 
     iterator.remove(); 
    } 
    connections.put(PSName+"_sSockets", sSockets); 

} 

private static void initSocketPool(JsonObject PaymentSystem, String socketConfigPath, JsonParser parser,String PSName, JsonObject ConnectionsConfig){ 

    SocketPoolFactory spf = new SocketPoolFactory(); 
    SocketPool sp = new SocketPool(spf,SocketPoolConfig); 
    JsonObject address = ConnectionsConfig.getAsJsonObject("Connections"); 
    try {   

     Set<Map.Entry<String, JsonElement>> map = address.entrySet(); 
     Iterator<Map.Entry<String, JsonElement>> iterator = map.iterator(); 
     int size = map.size(); 

     for(int k = 0; k < size; k++) 
     { 
      String IP = iterator.next().getKey(); 
      JsonArray Sockets = address.getAsJsonArray(IP); 

      for(int i=0;i<Sockets.size();i++) 
      { 
       JsonArray Ports = Sockets.get(i).getAsJsonArray(); 
       int first = Ports.get(0).getAsInt(); 
       int dif = Ports.get(1).getAsInt()-first+1; 
       for(int j=0;j<dif;j++) 
       { 
        sp.addSocket(IP,first+j); 
        log.trace("Pool Socket IP:"+IP+" Port:"+first+j+" Added"); 
       } 
      } 
      iterator.remove(); 
     } 


    } catch (Exception e) { 
     log.error(e); 
    } 

    connections.put(PSName+"_SocketPool", sp); 
    connections.put(PSName+"_SocketPoolFactory",spf); 
} 

public HashMap<String, Object> getConnections() { 
    return connections; 
} 


public JsonObject getCatalog() { 
    return catalog; 
} 

public void setCatalog(JsonObject catalog) { 
    this.catalog = catalog; 
} 

}

,這是我的applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 

    <beans default-autowire="byName" 
    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:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    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.1.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

    <context:annotation-config/> 

    <bean id="dataSource" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" > 
      <value>oracle.jdbc.driver.OracleDriver</value> 
     </property> 
     <property name="url"> 
      <value>jdbc:oracle:thin:@10.0.0.66:1521:bgw</value> 
     </property> 
     <property name="username"> 
      <value>POSMOVIL</value> 
     </property> 
     <property name="password"> 
      <value>ORACLE</value> 
     </property> 
    </bean> 


     <!-- Definición de la fábrica de sesiones de Hibernate administrada por Spring --> 
    <!-- Mapeo de Hibernate de archivos hbm.xml --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="mappingResources"> 
      <list> 
       <value>com/globalcca/pos_movil_desc/modelo/Afiliado.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/App.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Approl.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Archivo.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Banco.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/BloquesHorarios.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Calendario.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Capk.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Comprobante.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Config.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/ConstanteCalendario.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Contactos.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Crl.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Dispone.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Disponibilidad.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Dominio.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Funcion.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Hclaves.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Horario.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Horariodia.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/MasterKey.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Mensaje.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Modulo.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Operador.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/PaymentSystem.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Rol.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Sitio.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Solicitud.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Tarea.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Tarearol.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/TarjetaHabiente.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Terminal.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Terminalitem.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Termpaysys.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Transac.hbm.xml</value> 
       <value>com/globalcca/pos_movil_desc/modelo/Usuario.hbm.xml</value> 
      </list> 
     </property> 

     <!-- Conexion a la BD especificada en WEB-INF/applicationContex.xml --> 

     <property name="dataSource"> 
      <ref bean="dataSource" /> 
     </property> 

     <!-- Propiedades de Hibernate --> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.use_sql_comments">true</prop> 
      </props> 
     </property> 
    </bean> 

    <!-- Configuración del repositorio de datos persistentes --> 

    <!-- 
    <bean id="servletContext" class="org.springframework.web.context.support.ServletContextFactoryBean"/> 

    --> 
    <bean id="Services" class="com.globalcca.pos_movil_tran.services.Services"> 
     <constructor-arg name="context" ref="servletContext"/> 
    </bean> 

    <!-- Definición de las implementaciones (utilizando Hibernate) de los DAO'S --> 
    <bean id="afiliadoDao" class="com.globalcca.pos_movil_tran.dao.impl.AfiliadoDaoHibernate"/> 
    <bean id="archivoDao" class="com.globalcca.pos_movil_tran.dao.impl.ArchivoDaoHibernate"/> 
    <bean id="bancoDao" class="com.globalcca.pos_movil_tran.dao.impl.BancoDaoHibernate"/> 
    <bean id="bloqueoDao" class="com.globalcca.pos_movil_tran.dao.impl.BloqueDaoHibernate"/> 
    <bean id="calendarioDao" class="com.globalcca.pos_movil_tran.dao.impl.CalendarioDaoHibernate"/> 
    <bean id="comprobanteDao" class="com.globalcca.pos_movil_tran.dao.impl.ComprobanteDaoHibernate"/> 
    <bean id="configDao" class="com.globalcca.pos_movil_tran.dao.impl.ConfigDaoHibernate"/> 
    <bean id="constanteCalendarioDao" class="com.globalcca.pos_movil_tran.dao.impl.ConstanteCalendarioDaoHibernate"/> 
    <bean id="disponeDao" class="com.globalcca.pos_movil_tran.dao.impl.DisponeDaoHibernate"/> 
    <bean id="disponibilidadDao" class="com.globalcca.pos_movil_tran.dao.impl.DisponibilidadDaoHibernate"/> 
    <bean id="dominioDao" class="com.globalcca.pos_movil_tran.dao.impl.DominioDaoHibernate"/> 
    <bean id="horarioDao" class="com.globalcca.pos_movil_tran.dao.impl.HorarioDaoHibernate"/> 
    <bean id="horarioDiaDao" class="com.globalcca.pos_movil_tran.dao.impl.HorarioDiaDaoHibernate"/> 
    <bean id="mensajeDao" class="com.globalcca.pos_movil_tran.dao.impl.MensajeDaoHibernate"/> 
    <bean id="operadorDao" class="com.globalcca.pos_movil_tran.dao.impl.OperadorDaoHibernate"/> 
    <bean id="paymentSystemDao" class="com.globalcca.pos_movil_tran.dao.impl.PaymentSystemDaoHibernate"/> 
    <bean id="sitioDao" class="com.globalcca.pos_movil_tran.dao.impl.SitioDaoHibernate"/> 
    <bean id="solicitudDao" class="com.globalcca.pos_movil_tran.dao.impl.SolicitudDaoHibernate"/> 
    <bean id="tarjetaHabienteDao" class="com.globalcca.pos_movil_tran.dao.impl.TarjetaHabienteDaoHibernate"/> 
    <bean id="terminalDao" class="com.globalcca.pos_movil_tran.dao.impl.TerminalDaoHibernate"/> 
    <bean id="terminalItemDao" class="com.globalcca.pos_movil_tran.dao.impl.TerminalItemDaoHibernate"/> 
    <bean id="termPaySysDao" class="com.globalcca.pos_movil_tran.dao.impl.TermPaySysDaoHibernate"/> 
    <bean id="transacDao" class="com.globalcca.pos_movil_tran.dao.impl.TransacDaoHibernate"/> 
    <bean id="usuarioDao" class="com.globalcca.pos_movil_tran.dao.impl.UsuarioDaoHibernate"/> 

    <!-- Definición del manejador de transacciones de Spring --> 
    <bean id="transactionManager" 
      class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <!-- Activar el comportamiento transaccional de los métodos y --> 
    <!-- clases anotados como @Transactional      --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 


    <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"> 
     <property name="configLocation" value="classpath:./classes/quartz.properties"/> 
     <property name="waitForJobsToCompleteOnShutdown" value="false" /> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="applicationContextSchedulerContextKey"> 
      <value>applicationContext</value> 
     </property> 
     <property name="autoStartup"> 
       <value>true</value> 
     </property>  
    </bean> 

服務豆使用servlet上下文,我在環境類中使用這個bean。你可以使用@Autowired提供解決方案嗎?

有人可以拿這個代碼,並舉例說明如何使用@Autowired?

我嘗試在我的服務中使用@Autowired,但仍然給我null。

請我需要幫助

+2

從[javadoc](http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/context/support/ServletContextFactoryBean.html):已棄用。從Spring 3.0開始,因爲「servletContext」現在可用作每個WebApplicationContext中的默認bean。所以你可以刪除並直接@Autowire servletContext – 2014-10-10 19:37:39

+0

請你能給我一個例子嗎?我不懂如何使用@Autowire。 – 2014-10-10 20:26:27

+0

看Biju答案;) – 2014-10-10 20:27:34

回答

3

你並不真的需要了這個bean,先走一步,刪除它,你在哪裏都注入了參數servletContext,它應該只是以這種方式工作:

@Autowired 
ServletContext context; 
+0

讓我告訴你我的代碼。 – 2014-10-10 20:29:23

+0

我將我的代碼添加到原文中,請幫助 – 2014-10-10 20:34:17

+0

Pedro,我假設您有一個web應用程序,如果您不這樣創建應用程序上下文,有更簡單的方法來做到這一點(通過ContextLoaderListener)。你能否也請告訴我你是如何使用servletcontext的 - 我可以根據你的使用情況向你展示一個更好的例子 – 2014-10-10 20:40:57