2017-04-25 5 views
1

injizieren Ich versuche eine einfache Anwendung im Frühjahr mvc nur mit Anmerkungen. In meiner Serviceklasse kann ich keine DAO-Klasse injizieren, obwohl ich relevante Anmerkungen verwendet habe. Bitte lassen Sie mich wissen, welchen Fehler ich mache. Unten sind meine Klassendefinitionen.nicht in der Lage, Bean in einfache Feder mvc Anwendung

  public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

       @Override 
       protected Class<?>[] getRootConfigClasses() { 
        return new Class[] { SpringRootConfig.class }; 
        //return null; 
       } 

       @Override 
       protected Class<?>[] getServletConfigClasses() { 
        return new Class[] { SpringWebConfiguration.class }; 
       } 

       @Override 
       protected String[] getServletMappings() { 
        return new String[] { "/" }; 
       } 
      } 

     @Configuration 
     @EnableWebMvc 
     @ComponentScan(basePackages="com.emp.controller") 
     public class SpringWebConfiguration extends WebMvcConfigurerAdapter{ 

      @Bean 
      public InternalResourceViewResolver jspViewResolver() { 
      InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();  
         viewResolver.setPrefix("/WEB-INF/view/"); 
         viewResolver.setSuffix(".jsp"); 
         return viewResolver; 

       } 
      } 

    @Configuration 
    @EnableWebMvc 
    @ComponentScan(basePackages="com.emp.svc,com.emp.dao") 
    public class SpringRootConfig { 

    } 


    package com.emp.svc; 

    import org.springframework.beans.factory.annotation.Autowired; 
    import com.emp.dao.LoginDAO; 
    public class LoginSvc { 

     @Autowired 
     private LoginDAO dao; 

     public boolean validateLogin(){ 
      System.out.println("In the svc method"); 
      return dao.validateLogin(); 
     } 
    } 


    package com.emp.dao; 

    import org.springframework.stereotype.Component; 
    import org.springframework.stereotype.Repository; 

    @Repository 
    public class LoginDAO { 

     public boolean validateLogin(){ 
      System.out.println("In the DAO method"); 
      return true; 
     } 
    } 

package com.emp.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.ModelAndView; 

import com.emp.forms.LoginForm; 
import com.emp.svc.LoginSvc; 

@Controller 
public class LoginController { 

    @RequestMapping(value = {"/login"},method = RequestMethod.GET) 
    public ModelAndView launchLoginPage(){ 
     ModelAndView model = new ModelAndView(); 
     model.setViewName("login"); 
     return model; 
    } 

    @RequestMapping(value = {"/welcome"},method = RequestMethod.GET) 
    public ModelAndView validateLogin(@ModelAttribute LoginForm form){ 
     ModelAndView model = new ModelAndView(); 
     LoginSvc svc = new LoginSvc(); 
     if(svc.validateLogin()){ 
      model.setViewName("welcome"); 
     } 
     else 
     { 
      model.setViewName("login"); 
     } 
     return model; 
    } 

LoginSvc wird vom Controller aufgerufen. Ich erwarte, dass in LoginSvc LoginDAO injiziert wird und daher der Aufruf von dao dao.validateLogin() erfolgreich ist. Aber was ich bekomme, ist der Null-Zeiger bei dao.validateLogin(), was anzeigt, dass LoginDAO nicht injiziert wird.

Wenn Sie mir mitteilen können, was ich vermisse, wird es eine große Hilfe sein.

+0

Beschriften Sie Ihre 'LoginSvc' -Klasse mit' @ controller' Annotation. – hagrawal

+0

Ich habe separate Controller-Klasse, (ich habe meine Controller-Klasse jetzt hinzugefügt) sollte ich noch Svc-Klasse mit @ Controller kommentieren? – Anveshan

+1

Ja, Sie sollten die 'LoginSvc'-Klasse mit Anmerkungen versehen, damit sie zum Controller wird. Wenn Sie nicht kommentieren, würde spring die Abhängigkeit nicht injizieren. – hagrawal

Antwort

2

Fügen Sie @Service-Annotation in Ihre LoginSvc-Klasse ein.

package com.emp.svc; 

import org.springframework.beans.factory.annotation.Autowired; 
import com.emp.dao.LoginDAO; 

@Service 
public class LoginSvc { 

    @Autowired 
    private LoginDAO dao; 

    public boolean validateLogin(){ 
     System.out.println("In the svc method"); 
     return dao.validateLogin(); 
    } 
} 

Und autowire LoginSvc in Ihrem Controller. Wenn Sie das Objekt selbst erstellen, indem Sie den Konstruktor von LoginSvc aufrufen, bietet spring keinen autowire-Kandidaten an.

@Controller 
public class LoginController { 

    @Autowired 
    private LoginSvc svc; 

    @RequestMapping(value = {"/login"},method = RequestMethod.GET) 
    public ModelAndView launchLoginPage(){ 
     ModelAndView model = new ModelAndView(); 
     model.setViewName("login"); 
     return model; 
    } 

    @RequestMapping(value = {"/welcome"},method = RequestMethod.GET) 
    public ModelAndView validateLogin(@ModelAttribute LoginForm form){ 
     ModelAndView model = new ModelAndView();    
     if(svc.validateLogin()) { 
      model.setViewName("welcome"); 
     } else { 
      model.setViewName("login"); 
     } 
     return model; 
    } 
} 
+0

Nur nach dem Hinzufügen der Autowired-Annotation in der Controller-Klasse funktioniert es. – Anveshan