Java – SpringMVC – 在控制器中获取参数

我有一个问题是将对象持久化到我的数据库中。 我有一个与Profil有多对一关系的用户。

我的JSP只是添加了一个新用户。 因此,JSP包含字段和带有所需profil的comboxBox。 问题是,当我运行程序时,即使我在comboxBox中选择了一个profil,控制器中的属性user.profil也是NULL。

这是User对象:

package com.app.model; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name="user") public class User { private long id; private String firstname; private String lastname; private String login; private String password; private Profil profil; public User() { } /** * @param firstname * @param lastname * @param login * @param password * @param profil */ public User(String firstname, String lastname, String login, String password, Profil profil) { this.firstname = firstname; this.lastname = lastname; this.login = login; this.password = password; this.profil = profil; } /** * Get User Id * * @return long - User Id */ @Id @Column(name="id", unique = true, nullable = false) public long getId() { return id; } /** * Set User Id * * @param long - User Id */ public void setId(long id) { this.id = id; } /** * Get User Firstname * * @return String - User Firstname */ @Column(name="firstname", unique = false, nullable = false) public String getFirstname() { return firstname; } /** * Set User Firstname * * @param String - User Firstname */ public void setFirstname(String firstname) { this.firstname = firstname; } /** * Get User Lastname * * @return String - User Lastname */ @Column(name="lastname", unique = false, nullable = false) public String getLastname() { return lastname; } /** * Set User Lastname * * @param String - User Lastname */ public void setLastname(String lastname) { this.lastname = lastname; } /** * @return the login */ @Column(name="login", unique = true, nullable = false) public String getLogin() { return login; } /** * @param login the login to set */ public void setLogin(String login) { this.login = login; } /** * @return the password */ @Column(name="password", unique = false, nullable = false) public String getPassword() { return password; } /** * @param password the password to set */ public void setPassword(String password) { this.password = password; } /** * @return the profil */ @ManyToOne( cascade = CascadeType.REFRESH, fetch = FetchType.EAGER ) @JoinColumn( name = "fk_profil_id", nullable = false ) public Profil getProfil() { return profil; } /** * @param profil the profil to set */ public void setProfil(Profil profil) { this.profil = profil; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "User [id=" + id + ", firstname=" + firstname + ", lastname=" + lastname + ", login=" + login + ", password=" + password + "]"; } } 

这是Profil对象:

 package com.app.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="profil") public class Profil { private long id; private String name; public Profil() { } /** * @param id * @param name */ public Profil(long id, String name) { this.id = id; this.name = name; } /** * @return the id */ @Id @Column(name="id", unique = true, nullable = false) public long getId() { return id; } /** * @param id the id to set */ public void setId(long id) { this.id = id; } /** * @return the name */ @Column(name="name", unique = true, nullable = false) public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Profil [id=" + id + "]"; } } 

这是控制器:

 package com.app.web; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; 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.servlet.ModelAndView; import com.app.model.User; import com.app.service.impl.ProfilService; import com.app.service.impl.UserService; @Controller @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @Autowired private ProfilService profilService; @ModelAttribute("userForm") public User createForm() { return new User(); } @RequestMapping(value = "/save", method = RequestMethod.POST) public ModelAndView saveUser ( @ModelAttribute("userForm") User user, BindingResult result ) { userService.addUser( user ); return new ModelAndView ( "redirect:/users.html" ); } @RequestMapping(method = RequestMethod.GET) public ModelAndView viewUsers() { Map model = new HashMap(); model.put ( "users", userService.getUsers() ); return new ModelAndView ( "usersView", model ); } @RequestMapping(value = "/add", method = RequestMethod.GET) public ModelAndView addUser() { Map model = new HashMap(); model.put ( "profils", profilService.getProfils() ); return new ModelAndView ( "userAdd", model ); } } 

这是JSP页面:

       Add User   

Add User

View Existing Users

Firstname:

Lastname:

Login:

Password:

例外情况:

 SEVERE: Servlet.service() for servlet [spring] in context with path [/app] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: Column 'fk_profil_id' cannot be null; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Column 'fk_profil_id' cannot be null] with root cause com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'fk_profil_id' cannot be null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) ... ... ... 

发生此exception是因为控制器中的user.profil为NULL。

如果您需要更多信息,请随时提出。 顺便说一句,如果你发现错误或更好的方法,请告诉我,我是spring和spring的新人。

非常感谢

在您的JSP页面combobox中应该有如下路径

     

这将要求spring转换创建新的profil实例并附加User。