Please help me with learning the basics of Spring 3 MVC better, I was trying to learn about Spring JSR 303: Bean Validation and could not solve the below problem at all, I have spent over a day on this already :(
I want a simple validation to work here. The name, password and email fields in hello.jsp can not be left blank, that's quite is the objective. As of now every time the hello.jsp is attempted to be submitted with all the fields as blank the below error is encountered
HTTP Status 500 - Handler processing failed; nested exception is java.lang.AbstractMethodError: org.hibernate.ejb.HibernatePersistence.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
The error stack :
HTTP Status 500 - Handler processing failed; nested exception is java.lang.AbstractMethodError: org.hibernate.ejb.HibernatePersistence.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
type Exception report
message Handler processing failed; nested exception is java.lang.AbstractMethodError: org.hibernate.ejb.HibernatePersistence.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
description The server encountered an internal error (Handler processing failed; nested exception is java.lang.AbstractMethodError: org.hibernate.ejb.HibernatePersistence.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;) that prevented it from fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.AbstractMethodError: org.hibernate.ejb.HibernatePersistence.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:972)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
java.lang.AbstractMethodError: org.hibernate.ejb.HibernatePersistence.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
javax.persistence.Persistence$1.isLoaded(Persistence.java:78)
org.hibernate.validator.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:61)
org.hibernate.validator.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:131)
org.hibernate.validator.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:46)
org.hibernate.validator.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1242)
org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:448)
org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:397)
org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:361)
org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:313)
org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:139)
org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:101)
org.springframework.validation.DataBinder.validate(DataBinder.java:722)
org.springframework.web.method.annotation.ModelAttributeMethodProcessor.validateIfApplicable(ModelAttributeMethodProcessor.java:155)
org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:108)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
All the jars used are :
*The controller : MainController.java *
package com.poc.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
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.bind.annotation.RequestParam;
import com.poc.bean.UserBean;
import com.poc.service.DaoService;
import com.poc.service.MailService;
import com.poc.service.MailServiceImpl;
import javax.validation.Valid;
@Controller
public class MainController {
@Autowired
DaoService d;
UserBean user;
@Autowired
MailService mailService;
@RequestMapping("/")
public String hello(Model model) {
return "hello";
}
@ModelAttribute("user")
public UserBean getUserForm() {
return new UserBean();
}
@RequestMapping(value = "/hi", method = RequestMethod.POST)
public String hi(@ModelAttribute("user")@Valid UserBean user,BindingResult result ) {
if (result.hasErrors()) {
return "hello";
} else {
d.insert(user);
//Send a composed mail
mailService.sendMail(user.getEmailid(), "Registration Acknowledgement", "You have successfully registered with us. Your password is "+user.getPasswd());
String message = "Hi " + user.getName() + "!";
//model.addAttribute("message", message);
return "redirect:/index";}
}
@RequestMapping("/index")
public String listContacts(Map<String, Object> map) {
map.put("user", new UserBean());
map.put("userList", d.listAll());
return "hello";
}
}
The hello.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<!-- <style>
.error {
color: #ff0000;
}
.errorblock {
color: #000;
background-color: #ffEEEE;
border: 3px solid #ff0000;
padding: 8px;
margin: 16px;
}
</style> -->
<style>
.error {
color: #EF1313;
font-style: italic;
}
</style>
<head>
<title>Home</title>
</head>
<body>
<h1>Hello World!</h1>
<hr/>
<form:form action="hi" commandName="user">
<table>
<tr>
<td><font face="verdana" size="2px">Name</font></td>
<td>:</td>
<td>
<font face="verdana" size="2">
<form:input path="name" /> <form:errors path="name"></form:errors>
</font>
</td>
</tr>
<tr>
<td><font face="verdana" size="2px">Password</font></td>
<td>:</td>
<td>
<font face="verdana" size="2">
<form:input path="passwd" /> <form:errors path="passwd"></form:errors>
</font>
</td>
</tr>
<tr>
<td><font face="verdana" size="2px">Email</font></td>
<td>:</td>
<td>
<font face="verdana" size="2">
<form:input path="emailid" /> <form:errors path="emailid"></form:errors>
</font>
</td>
</tr>
<tr>
<td>
<input type="submit" value="Submit" />
</td>
</tr>
</table>
</form:form>
<h3>Users</h3>
<c:if test="${!empty userList}">
<table class = "data"><tr>
<th>Name</th>
<th>Email</th>
</tr>
<c:forEach items= "${userList}" var = "user">
<tr>
<td>
${user.name}
</td>
<td>${user.emailid}</td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
Please let me know about the place where I am certainly missing out something. If it's jar compatibility issue then please mention the names of the jars that I need to replace.
Thanks in advance.
The versions of your libraries don't really play together. E.g. you use Hibernate ORM 3.2 (which implements JPA 1.0), while Hibernate Validator 4.2 by default works with JPA 2 (which is implemented by Hibernate ORM 3.5). Note that some other libs on your classpath don't look right:
I recommend to work with a dependency management tool (Ivy, Maven, Gradle) to sort these things out.