Java 严重:路径为[/com.elearning.webapp]的上下文中Servlet[spring]的Servlet.service()引发异常[请求处理失败;

Java 严重:路径为[/com.elearning.webapp]的上下文中Servlet[spring]的Servlet.service()引发异常[请求处理失败;,java,hibernate,spring-mvc,jpa,entitymanager,Java,Hibernate,Spring Mvc,Jpa,Entitymanager,我正在构建一个Spring MVC WebApp。我正在使用JPA和Hibernate。测试EntityManager时出错。我正在以以下方式进行设计和配置: BaseController.java public class BaseController { public Facade facade;//it is an interface /** * Inject Services from Spring */ public void se

我正在构建一个Spring MVC WebApp。我正在使用JPA和Hibernate。测试EntityManager时出错。我正在以以下方式进行设计和配置:

BaseController.java

public class BaseController {


    public Facade facade;//it is an interface


    /**
     * Inject Services from Spring
     */

    public void setFacade(Facade facade){
        this.facade = facade;
    }

}
@Controller
public class BlogController extends BaseController{



    @RequestMapping(value="blog/index")
    public String saveValueFromEM() {

        facade.saveCustomBlog();

        return "blog/index";
    }


      @RequestMapping(value="home") 
      public String saveValueFromJPARep() {
      //facade.saveRepositoryBlog();

      return "home"; 

      }

}
BlogController.java

public class BaseController {


    public Facade facade;//it is an interface


    /**
     * Inject Services from Spring
     */

    public void setFacade(Facade facade){
        this.facade = facade;
    }

}
@Controller
public class BlogController extends BaseController{



    @RequestMapping(value="blog/index")
    public String saveValueFromEM() {

        facade.saveCustomBlog();

        return "blog/index";
    }


      @RequestMapping(value="home") 
      public String saveValueFromJPARep() {
      //facade.saveRepositoryBlog();

      return "home"; 

      }

}
HibernateAuthenticator.java

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.transaction.annotation.Transactional;

@Transactional
public class HibernateAuthenticator {


    /**
     * Inject persistence layer to classes that extends this class
     * */
    public static EntityManager em;

    @PersistenceContext
    public void setEntityManager(EntityManager emf) {
        em = emf;
    }

}
FacadeImpl.java

public class FacadeImpl extends HibernateAuthenticator implements Facade {


    private BlogService blogService;//it is an interface


    @Override
    public void saveCustomBlog() {
        blogService.saveCustomBlog();

    }


    public void setBlogService(BlogService blogService) {
        this.blogService = blogService;
    }



}
@Transactional(readOnly = true)
public class BlogServiceImpl extends HibernateAuthenticator implements BlogService {



    @Override
    @Transactional(readOnly = false)
    public void saveCustomBlog() {
        // TODO Auto-generated method stub

        Blog blog=new Blog();
        blog.setId(13);
        blog.setName("Fation");
        em.merge(blog);

    }


}
BlogServiceImpl.java

public class FacadeImpl extends HibernateAuthenticator implements Facade {


    private BlogService blogService;//it is an interface


    @Override
    public void saveCustomBlog() {
        blogService.saveCustomBlog();

    }


    public void setBlogService(BlogService blogService) {
        this.blogService = blogService;
    }



}
@Transactional(readOnly = true)
public class BlogServiceImpl extends HibernateAuthenticator implements BlogService {



    @Override
    @Transactional(readOnly = false)
    public void saveCustomBlog() {
        // TODO Auto-generated method stub

        Blog blog=new Blog();
        blog.setId(13);
        blog.setName("Fation");
        em.merge(blog);

    }


}
web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <display-name>eLearning</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
根据您的代码,facade对象为空。您需要在BaseController中插入facade:


如果你正在构建一个新的应用程序,你可以参考这篇类似的文章-

,使用Spring Boot以现代的方式构建它。它消除了大多数这种配置的需要,也消除了很多错误的可能性。如果需要Facade,最好添加一个构造函数并要求子类来传递它。此外,对于setter注入,@Autowired应该应用于setter而不是字段,因为setter是公共的。
public class BaseController {

    @Autowired
    public Facade facade;


    /**
     * Inject Services from Spring
     */

    public void setFacade(Facade facade){
        this.facade = facade;
    }

}