ttivedcm ttivedcm - 7 months ago 50
Java Question

List of constraint violations when I add a recipe to a table using hibernate

I am trying to integrate Hibernate into my Spring project where a user can register, login and then they can create a recipe. The relationship I have set up means that a recipe must have one user. So in my RecipeDao the recipe gets the username through the principal.getName() then saves it with the recipe to the database. The recipe saves to my recipe table, however, I get thrown this error.

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [com.finalspringproject.dao.User] during update time for groups [com.finalspringproject.dao.PersistenceValidationGroup, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='may not be empty', propertyPath=password, rootBeanClass=class com.finalspringproject.dao.User, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
ConstraintViolationImpl{interpolatedMessage='may not be empty', propertyPath=email, rootBeanClass=class com.finalspringproject.dao.User, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
]
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:146)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
root cause

javax.validation.ConstraintViolationException: Validation failed for classes [com.finalspringproject.dao.User] during update time for groups [com.finalspringproject.dao.PersistenceValidationGroup, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='may not be empty', propertyPath=password, rootBeanClass=class com.finalspringproject.dao.User, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
ConstraintViolationImpl{interpolatedMessage='may not be empty', propertyPath=email, rootBeanClass=class com.finalspringproject.dao.User, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'}
]
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:161)
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreUpdate(BeanValidationEventListener.java:102)
org.hibernate.action.EntityUpdateAction.preUpdate(EntityUpdateAction.java:237)
org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:86)
org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185)
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:145)
org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95)
org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:925)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:738)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
com.finalspringproject.dao.RecipeDAO$$EnhancerByCGLIB$$40f9f16.saveOrUpdate(<generated>)
com.finalspringproject.service.RecipeService.saveOrUpdate(RecipeService.java:71)
com.finalspringproject.service.RecipeService$$FastClassByCGLIB$$96c55643.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:627)
com.finalspringproject.service.RecipeService$$EnhancerByCGLIB$$20d5df6c.saveOrUpdate(<generated>)
com.finalspringproject.controllers.RecipeController.doCreate(RecipeController.java:90)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:146)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)


This is my Recipe class.

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import javax.validation.constraints.Size;
@Entity
@Table(name="recipe")
public class Recipe {

@Id
private int id;

@Size(min = 5, max = 100,groups={FormValidationGroup.class,PersistenceValidationGroup.class})
private String titleParse;

@Size(min = 5, max = 200groups = {FormValidationGroup.class, PersistenceValidationGroup.class })
private String descriptionParse;

private String imageURLParse;

@NotNull(groups = {FormValidationGroup.class, PersistenceValidationGroup.class })
private String ratingParse;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="username")
private User user;

public Recipe() {
this.user= new User();
}

public Recipe(User user, String titleParse, String descriptionParse, String imageURLParse, String ratingParse) {
this.user = user;
this.titleParse = titleParse;
this.descriptionParse = descriptionParse;
this.imageURLParse = imageURLParse;
this.ratingParse = ratingParse;

}

public Recipe(int id, User user, String titleParse, String descriptionParse, String imageURLParse,
String ratingParse) {
this.id = id;
this.user = user;
this.titleParse = titleParse;
this.descriptionParse = descriptionParse;
this.imageURLParse = imageURLParse;
this.ratingParse = ratingParse;

}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getTitleParse() {
return titleParse;
}

public void setTitleParse(String titleParse) {
this.titleParse = titleParse;
}

public String getDescriptionParse() {
return descriptionParse;
}

public void setDescriptionParse(String descriptionParse) {
this.descriptionParse = descriptionParse;
}

public String getImageURLParse() {
return imageURLParse;
}

public void setImageURLParse(String imageURLParse) {
this.imageURLParse = imageURLParse;
}

public String getRatingParse() {
return ratingParse;
}

public void setRatingParse(String ratingParse) {
this.ratingParse = ratingParse;
}

public User getUser() {
return user;
}


public void setUser(User user) {
this.user = user;
}

public String getUsername() {
return user.getUsername();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((descriptionParse == null) ? 0 : descriptionParse.hashCode());
result = prime * result + ((imageURLParse == null) ? 0 : imageURLParse.hashCode());
result = prime * result + ((ratingParse == null) ? 0 : ratingParse.hashCode());
result = prime * result + ((titleParse == null) ? 0 : titleParse.hashCode());
result = prime * result + ((user == null) ? 0 : user.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Recipe other = (Recipe) obj;
if (descriptionParse == null) {
if (other.descriptionParse != null)
return false;
} else if (!descriptionParse.equals(other.descriptionParse))
return false;
if (imageURLParse == null) {
if (other.imageURLParse != null)
return false;
} else if (!imageURLParse.equals(other.imageURLParse))
return false;
if (ratingParse == null) {
if (other.ratingParse != null)
return false;
} else if (!ratingParse.equals(other.ratingParse))
return false;
if (titleParse == null) {
if (other.titleParse != null)
return false;
} else if (!titleParse.equals(other.titleParse))
return false;
if (user == null) {
if (other.user != null)
return false;
} else if (!user.equals(other.user))
return false;
return true;
}

}


This is my RecipeServiceClass.

@Service("recipeService")
public class RecipeService {

private RecipeDAO recipeDao;


public RecipeService() {

}
public List<Recipe> getCurrent() {
System.out.println("In the Current Service");
return recipeDao.getRecipe();

}

public List<Recipe> getCurrent(String username) {

System.out.println("In the Current Service with username");
return recipeDao.getRecipe(username);

}

@Autowired
public void setRecipeDao(RecipeDAO recipeDao) {
this.recipeDao = recipeDao;
}
@Secured({"ROLE_USER","ROLE_ADMIN"})
public void create(Recipe recipe){
recipeDao.saveOrUpdate(recipe);
}

public boolean hadRecipe(String name) {
if(name ==null) {
return false;
}

List<Recipe> recipes = recipeDao.getRecipe(name);

if(recipes.size()==0){
return false;
}
return true;
}
public Recipe getRecipe(String username) {

if(username==null){
return null;
}

List<Recipe> recipes = recipeDao.getRecipe(username);

if(recipes.size()==0){
return null;
}
return recipes.get(0);
}
public void saveOrUpdate(Recipe recipe) {

System.out.println("in the save or update/ Service");
recipeDao.saveOrUpdate(recipe);

}
public void delete(int id) {

recipeDao.delete(id);

}


}

This is my RecipeDao class.

@Transactional
@Repository
@Component("recipeDao")
public class RecipeDAO {

@Autowired
private SessionFactory sessionFactory;


public Session session() {
return sessionFactory.getCurrentSession();

}


@SuppressWarnings("unchecked")
public List<Recipe> getRecipe() {

System.out.println("In the get recipe, Dao");
Criteria crit = session().createCriteria(Recipe.class);
crit.createAlias("user", "u").add(Restrictions.eq("u.enabled", true));

System.out.println("In the get recipe, Dao2");
return crit.list();
}

@SuppressWarnings("unchecked")
public List<Recipe> getRecipe(String username) {

System.out.println("In the get recipe, Dao with username");
Criteria crit = session().createCriteria(Recipe.class);
crit.createAlias("user", "u");
crit.add(Restrictions.eq("u.enabled", true));
crit.add(Restrictions.eq("u.username", username));

System.out.println("In the get recipe, Dao with username2");
return crit.list();
}

public void saveOrUpdate(Recipe recipe) {

System.out.println("in the save session " + recipe.toString());
session().saveOrUpdate(recipe);

}

public boolean delete(int id) {
Query query = session().createQuery("delete from Recipe where id=:id");
query.setLong("id", id);
return query.executeUpdate() == 1;
}

public Recipe getRecipe(int id) {

Criteria crit = session().createCriteria(Recipe.class);
crit.createAlias("user", "u");
crit.add(Restrictions.eq("u.enabled", true));
crit.add(Restrictions.idEq(id));
return (Recipe) crit.uniqueResult();
}

}


This is my User class.

@Entity
@Table(name = "user")
public class User {

@Id
@NotBlank(groups = {FormValidationGroup.class, PersistenceValidationGroup.class })
@Size(min = 5, max = 20, groups = {FormValidationGroup.class, PersistenceValidationGroup.class })
private String username;

@NotBlank(groups = {FormValidationGroup.class, PersistenceValidationGroup.class })
@Email(message = "This is an invalid email address", groups = {FormValidationGroup.class,PersistenceValidationGroup.class })
private String email;

@NotBlank(groups = {FormValidationGroup.class, PersistenceValidationGroup.class })
@Size(min = 3, max = 15, groups = {FormValidationGroup.class })
private String password;

private boolean enabled = false;
private String authority;

public User() {

}

public User(String username, String email, String password, boolean enabled, String authority,
List<Recipe> recipe) {
super();
this.username = username;
this.email = email;
this.password = password;
this.enabled = enabled;
this.authority = authority;

}

public boolean isEnabled() {
return enabled;
}

public void setEnabled(boolean enabled) {
this.enabled = enabled;
}

public String getAuthority() {
return authority;
}

public void setAuthority(String authority) {
this.authority = authority;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}



public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((authority == null) ? 0 : authority.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + (enabled ? 1231 : 1237);
result = prime * result + ((password == null) ? 0 : password.hashCode());
result = prime * result + ((username == null) ? 0 : username.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (authority == null) {
if (other.authority != null)
return false;
} else if (!authority.equals(other.authority))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (enabled != other.enabled)
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
}

@Override
public String toString() {
return "User [ username=" + username + ", email=" + email + ", enabled=" + enabled
+ ", authority=" + authority + "]";
}

}


This is my Recipe Controller.

@Controller
public class RecipeController {


private RecipeService recipeService;

@Autowired
public void setRecipeService(RecipeService recipeService) {
this.recipeService = recipeService;
}


@RequestMapping("/allrecipes")
public String showRecipe(Model model) {

List<Recipe> recipe = recipeService.getCurrent();

model.addAttribute("recipe", recipe);

return "allrecipes";
}



@RequestMapping("/createrecipe")
public String createRecipe(Model model, Principal principal) {

System.out.println("in the create recipe");
Recipe recipe = null;
if (principal != null) {
String username = principal.getName();
System.out.println("in the create recipe, principal not null");
recipe = recipeService.getRecipe(username);
}

if (recipe == null) {

System.out.println("in the create recipe,new recipe");
recipe = new Recipe();
}

System.out.println("in the create recipe: " + recipe);

model.addAttribute("recipe",recipe);// command name in the form,
// must have an recipe
// object
System.out.println("in the create recipe:2 " + recipe);
return "createrecipe";
}

@RequestMapping(value = "/docreate", method = RequestMethod.POST)
public String doCreate(Model model, @Validated(value=FormValidationGroup.class) Recipe recipe,
BindingResult result, Principal principal,
@RequestParam(value = "delete", required = false) String delete) {

if (result.hasErrors()) {
return "createrecipe";
}

if (delete == null) {
String username = principal.getName();
recipe.getUser().setUsername(username);
System.out.println("in the docreate");
recipeService.saveOrUpdate(recipe);
return "recipecreated";
} else {
recipeService.delete(recipe.getId());
return "recipedeleted";
}

}

}


I just dont understand why it will add the recipe to the table but it throws an error. Thanks to whoever can help.

Answer

Is it okay to answer my own question? I fixed it by removing the

groups = {FormValidationGroup.class, PersistenceValidationGroup.class}

from each of the users attributes, its works perfect for the recipe class so I am unsure of why this happens. However removing it did fix my problem

Comments