2011-05-10 19 views
6

siguiente es mi clase:tema anotación @autowired, no la inyección de frijol en clase, utilizando Spring3.0, hibernación

package com.abc.trade.util; 

public class StockTraderLogger { 

    static Logger logger = Logger.getLogger("StockTraderLogger"); 

    @Autowired 
    ConfigService configService; 




    public static void debug(Object className, Object logMessage) {  
     try { 
      System.out.println("in debug.. "); 
      StockTraderLogger stl =new StockTraderLogger(); 
      stl.addMessage(""+convertToString(className)+"\t"+convertToString(logMessage)); 
      System.out.println("in debug..post "); 
     } catch (DataAccessException e) { 
      System.out.println("Caught exception..."); 
       e.printStackTrace(); 
     } 
    } 

    public void addMessage(String message) throws DataAccessException { 
     System.out.println("in add message of util. "); 
     System.out.println("String: " + configService); 

     configService.addMessage(message);   
    } 
} 

@Autowire anotación no está funcionando. Está mostrando el valor de configService como nulo cuando se llama al método addMessage. sin embargo, se inyecta correctamente en algunas de mis clases de Controlador pero no aquí.

¿Alguien puede explicar lo que es un problema? y cómo resolver este problema?

Código

para XML es: (beansdefinition.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:context="http://www.springframework.org/schema/context" 
      xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
      http://www.springframework.org/schema/aop 


    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

    <context:component-scan base-package="com.abc.trade.util"/> 
     <context:component-scan base-package="com.abc.trade.service"/> 

     <!-- Hibernate Configuration --> 
     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  

       <property name="annotatedClasses">  
        <list> 
      <value>com.abc.trade.model.Order</value> 
      <value>com.abc.trade.model.Profile</value> 
      <value>com.abc.trade.model.Log</value>     
        </list>  
       </property> 
      </bean> 

      <tx:annotation-driven/> 

      <bean id="transactionManager" 
       class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
       <property name="sessionFactory" ref="sessionFactory"/> 
      </bean> 

      <bean id="commonService" class="com.abc.trade.framework.service.CommonServiceImplementor"> 
       <property name="commonDao" ref="commonDao"/> 
      </bean> 

      <bean id="commonDao" class="com.abc.trade.framework.dao.HibernateDAO"> 
      <property name="sessionFactory"><ref local="sessionFactory"/></property> 

      </bean> 

      <bean id="configService" class="com.abc.trade.service.ConfigServiceImplementor" parent="commonService"> 
      </bean> 

      <import resource="../context/springws-servlet.xml"/> 
    </beans> 

Otra XML es: (SpringMVC-servlet.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:webflow="http://www.springframework.org/schema/webflow-config" 
    xmlns:context="http://www.springframework.org/schema/context" 
    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.xsd 
     http://www.springframework.org/schema/webflow-config 
     http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd"> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 


    <context:component-scan base-package="com.abc.trade.controller" /> 
    <context:component-scan base-package="com.abc.trade.util"/> 


    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
     <property name="basename" value="messages" /> 
    </bean> 

    <!-- Exception Resolver --> 
    <bean id="exceptionResolver" 
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
     <property name="exceptionMappings"> 
      <props> 
       <prop key="com.abc.trade.framework.exception.DataAccessException"> 
       errorPage</prop> 
       <prop key="java.sql.SQLException">errorPage</prop> 
       <prop key="java.lang.Exception">errorPage</prop> 
      </props> 
     </property> 
    </bean> 

</beans> 

gracias de antemano.

ConfigService:

package com.abc.trade.service; 
import org.springframework.stereotype.Service; 
import com.abc.trade.framework.exception.DataAccessException; 

public interface ConfigService { 

     public void addMessage(String message) throws DataAccessException; 
} 

Config servicio Implementor:

package com.abc.trade.service; 

import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.abc.trade.framework.exception.DataAccessException; 
import com.abc.trade.framework.service.CommonServiceImplementor; 
import com.abc.trade.model.Log; 
import com.abc.trade.model.Mode; 
import com.abc.trade.util.StockTraderLogger; 

@Service("configService") 
public class ConfigServiceImplementor extends CommonServiceImplementor implements ConfigService{ 

    String errorMessage = ""; 

    @Override 
    public void addMessage(String message) { 
     System.out.println("in add message of service..........."); 
     Log log = new Log(); 
     try{ 
      log.setMessage(message); 
      System.out.println("Message is: "+message); 
      int i=save(log); 
     }catch(Exception e) 
     { 
      errorMessage = "Error in saving debug message"; 
      e.printStackTrace(); 
      //throw new DataAccessException(errorMessage); 
     } 

    } 

} 
+0

¿Cuál es el nombre de clase de paquete completo de la clase ConfigService? Creo que la inyección predeterminada es por tipo, no por nombre. – DwB

+0

He conectado automáticamente este bean en el controlador y está funcionando bien, pero si me conecté de forma automática en algunas otras clases, entonces no se está autoconectando. – Sagar

+0

¿Pasó a resolver el problema sagar ??? –

Respuesta

1

creo que se echa en falta

<context:annotation-config /> 

También asegúrese de que su clase tiene ConfigService

@Service("configService") 

Anotación, hará que esta clase sea candidata para el autoenvío.

y de la causa se debe utilizar

<context:component-scan base-package="package" /> 

para el nombre del paquete ConfigService.

+0

Intenté ambos, pero aún muestra nulo como salida. – Sagar

+0

escaneo de componentes está en mi XML, se puede ver que en código XML he compartido en cuestión. ¿Necesito cambiarlo? – Sagar

+0

necesita cambiar o agregar uno nuevo que hace referencia al paquete configService –

8

StockTraderLogger no está declarado como Spring Bean y no existe en primavera y, por ese motivo, la inyección no funcionará.

<bean id="StockTraderLogger" class="com.abc.trade.util.StockTraderLogger"/> 

o

@Component 
public class StockTraderLogger { /**/ } 
+0

Ambos no funcionan – Sagar

2

Añadir esto a applicationContext.xml:

xmlns:mvc="http://www.springframework.org/schema/mvc"

y

http://www.springframework.org/schema/mvc a xsi:schemalocation

mvc-anotación impulsada se requiere para los controladores anotadas y otras características:

<mvc:annotation-driven />

+0

También probé esto en mi aplicación, no funciona, eso es un problema grave. Vamos a cerrarlo como sea posible. – Akash5288

3

Aquí el problema es en el método de depuración:

StockTraderLogger stl =new StockTraderLogger(); 

Ésta no es la primavera logró. Puede inyectar Spring managed bean en una forma no administrada de dos maneras. Aquí se puede inyectar en ConfigService StockTraderLogger como:

1) Por AutowireCapableBeanFactory:

ApplicationContext ctx = new ClassPathXmlApplicationContext("beansdefinition.xml"); 
    StockTraderLogger stl = new StockTraderLogger(); 
    ctx.getAutowireCapableBeanFactory().autowireBeanProperties(stl, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true); 

2) Mediante el uso de la primavera AOP @Configurable anotación que marca una clase como elegible para la configuración impulsada por el resorte (como objetos instanciados con el operador 'nuevo').

@Configurable 
    public class StockTraderLogger { 
    ... 
    } 

and specifying this <context:spring-configured/> in beansdefinition.xml. 

Puede encontrar más información sobre esta primavera AOP manera here.

Cuestiones relacionadas