我使用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。
请我需要帮助
从[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
请你能给我一个例子吗?我不懂如何使用@Autowire。 – 2014-10-10 20:26:27
看Biju答案;) – 2014-10-10 20:27:34