Java 严重:路径为[/com.elearning.webapp]的上下文中Servlet[spring]的Servlet.service()引发异常[请求处理失败;
我正在构建一个Spring MVC WebApp。我正在使用JPA和Hibernate。测试EntityManager时出错。我正在以以下方式进行设计和配置: BaseController.javaJava 严重:路径为[/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
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;
}
}