2012-08-01 8 views
17

Ich erstelle Web-Anwendung mit Spring, Hibernate, Struts und Maven.Injection der autowired Abhängigkeiten fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException:

Ich erhalte die unten Fehlermeldung, wenn ich mvn clean install Befehl ausführen:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.project.action.PasswordHintActionTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.project.action.PasswordHintAction com.project.action.PasswordHintActionTest.action; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.project.action.PasswordHintAction] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Das Folgende ist die Klasse, die die Autowired Abhängigkeit hat:

import com.opensymphony.xwork2.Action; 
import org.project.model.User; 
import org.proejct.service.UserManager; 
import org.junit.Test; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.subethamail.wiser.Wiser; 

import static org.junit.Assert.*; 
public class PasswordHintActionTest extends BaseActionTestCase { 
    @Autowired 
    private PasswordHintAction action; 
    @Autowired 
    private UserManager userManager; 

    @Test 
    public void testExecute() throws Exception { 
     // start SMTP Server 
     Wiser wiser = new Wiser(); 
     wiser.setPort(getSmtpPort()); 
     wiser.start(); 

     action.setUsername("user"); 
     assertEquals("success", action.execute()); 
     assertFalse(action.hasActionErrors()); 

     // verify an account information e-mail was sent 
     wiser.stop(); 
     assertTrue(wiser.getMessages().size() == 1); 

     // verify that success messages are in the request 
     assertNotNull(action.getSession().getAttribute("messages")); 
    } 


} 

Mein 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: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/context http://www.springframework.org/schema/context/spring-context.xsd" 
     default-lazy-init="true"> 

    <!-- Activates scanning of @Autowired --> 
    <context:annotation-config/> 

    <!-- Activates scanning of @Repository and @Service --> 
    <context:component-scan base-package="com.project"/> 

    <!-- Compass Search Section --> 
    <!-- Compass Bean, automatically scanning for searchable classes within the model --> 
    <!-- Hooks into Spring transaction management and stores the index on the file system --> 
    <bean id="compass" class="org.compass.spring.LocalCompassBean"> 
     <property name="mappingScan" value="org.project"/> 
     <property name="postProcessor" ref="compassPostProcessor"/> 
     <property name="transactionManager" ref="transactionManager" /> 
     <property name="settings"> 
      <map> 
       <entry key="compass.engine.connection" value="target/test-index" /> 
      </map> 
     </property> 
    </bean> 

I habe zu meiner Kontextkonfiguration hinzugefügt, um Autowired abhängig zu scannen encies. Aber ich bin nicht sicher, warum es immer noch diese Ausnahme gibt.

Ich habe versucht, es in folgender Weise auch das Hinzufügen, aber ich bekomme immer noch die gleiche Ausnahme

<context:component-scan base-package="com.project.*"/> 

UPDATE:

finden Sie die Kennworthinweis Aktion

import org.project.model.User; 
import com.project.webapp.util.RequestUtil; 
import org.springframework.mail.MailException; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 

import java.util.ArrayList; 
import java.util.List; 


public class PasswordHintAction extends BaseAction { 
    private static final long serialVersionUID = -4037514607101222025L; 
    private String username; 

    /** 
    * @param username The username to set. 
    */ 
    public void setUsername(String username) { 
     this.username = username; 
    } 

    /** 
    * Execute sending the password hint via e-mail. 
    * 
    * @return success if username works, input if not 
    */ 
    public String execute() { 
     List<Object> args = new ArrayList<Object>(); 

     // ensure that the username has been sent 
     if (username == null) { 
      log.warn("Username not specified, notifying user that it's a required field."); 

      args.add(getText("user.username")); 
      addActionError(getText("errors.requiredField", args)); 
      return INPUT; 
     } 

     if (log.isDebugEnabled()) { 
      log.debug("Processing Password Hint..."); 
     } 

     // look up the user's information 
     try { 
      User user = userManager.getUserByUsername(username); 
      String hint = user.getPasswordHint(); 

      if (hint == null || hint.trim().equals("")) { 
       log.warn("User '" + username + "' found, but no password hint exists."); 
       addActionError(getText("login.passwordHint.missing")); 
       return INPUT; 
      } 

      StringBuffer msg = new StringBuffer(); 
      msg.append("Your password hint is: ").append(hint); 
      msg.append("\n\nLogin at: ").append(RequestUtil.getAppURL(getRequest())); 

      mailMessage.setTo(user.getEmail()); 
      String subject = '[' + getText("webapp.name") + "] " + getText("user.passwordHint"); 
      mailMessage.setSubject(subject); 
      mailMessage.setText(msg.toString()); 
      mailEngine.send(mailMessage); 

      args.add(username); 
      args.add(user.getEmail()); 

      saveMessage(getText("login.passwordHint.sent", args)); 
     } catch (UsernameNotFoundException e) { 
      log.warn(e.getMessage()); 
      args.add(username); 
      addActionError(getText("login.passwordHint.error", args)); 
      getSession().setAttribute("errors", getActionErrors()); 
      return INPUT; 
     } catch (MailException me) { 
      addActionError(me.getCause().getLocalizedMessage()); 
      getSession().setAttribute("errors", getActionErrors()); 
      return INPUT; 
     } 

     return SUCCESS; 
    } 
} 

Update 2:

applicationContext-struts.xml:

<bean id="passwordHintAction" class="com.project.action.PasswordHintAction" scope="prototype"> 
    <property name="userManager" ref="userManager"/> 
    <property name="mailEngine" ref="mailEngine"/> 
    <property name="mailMessage" ref="mailMessage"/> 
</bean> 
+0

ich nur einen Teil Ihrer Kontextdatei sehen, die keine Bohne vom Typ PasswordHintAction enthalten –

+0

@Kltis: bearbeitete Antwort –

+0

@Klits: Ich habe meine Antwort bearbeitet, schauen Sie. –

Antwort

21

Verwenden Komponente Scannen wie unten angegeben, wenn com.project.action.PasswordHintAction mit Klischee bezeichnet ist Annotationen

<context:component-scan base-package="com.project.action"/> 

EDIT

ich Ihr Problem zu sehen, in PasswordHintActionTest Sie autowiring PasswordHintAction. Aber Sie haben keine Bean-Konfiguration für PasswordHintAction zum Autowire erstellt.In einen der Klischee-Annotation (@Component, @Service, @Controller) zu PasswordHintAction wie

@Component 
public class PasswordHintAction extends BaseAction { 
    private static final long serialVersionUID = -4037514607101222025L; 
    private String username; 

oder XML-Konfiguration erstellen in applicationcontext.xml wie

<bean id="passwordHintAction" class="com.project.action.PasswordHintAction" /> 
+2

eigentlich hatte ich das war Konfiguration ist separate Konfigurationsdatei namens ApplicationContext-struts.xml. Ich habe meine Frage mit diesem Update aktualisiert. aber selbst damit bekomme ich diesen Fehler – KItis

+0

Danke für Ihre Antwort, ich habe nicht die Datei applicationContext-struts.xml in meine Datei web.xml eingebunden. Das war das Problem. Wie auch immer, deine Antwort hat mir geholfen, in diese Lösung zu kommen. – KItis

3

Sie müssen einen Kandidaten für Autowire bereitstellen. Das bedeutet, dass eine Instanz von PasswordHint dafür bekannt sein muss, dass sie so springt, dass sie erraten kann, dass sie darauf verweisen muss.

Geben Sie den Klassenkopf von PasswordHint und/oder die Spring Bean-Definition dieser Klasse für weitere Unterstützung an.

Versuchen Sie, den Namen des

PasswordHintAction action; 

zu

PasswordHintAction passwordHintAction; 

so dass es passt die Bean-Definition ändern.

+0

danke für Ihre Mühe, sowieso Problem war ich hatte nicht die applicationContxt-strtus.xml whih hat passwordhintaction Bean-Definition mit web.xml-Datei unter Kontext Parameter verknüpft . – KItis

Verwandte Themen