我是 Spring 和 Java 的新手,并且正在使用 JSP、JSTL、Hibernate/JPA 和模型类让表单在 Spring MVC 中工作。我可以让页面正常显示,但是应该创建用户的帖子给了我一个错误。
Failed to convert property value of type java.lang.String to required type com.everesttech.recruiting.searchtool.entity.Role for property user.role; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.everesttech.recruiting.searchtool.entity.Role] for property role: no matching editors or conversion strategy found
这个错误是有道理的,因为表单正在传回 Role 的 ID,而 User 对象期望传递 Role 对象。但是我不确定如何解决这个问题,同时仍然允许我的 JSP 由我的实际 Entity 对象支持,因为我想使用 Spring/Hibernate 验证。有没有一种方法可以声明该表单:select 作为 Role 对象?非常感谢任何建议或解决方案。先谢谢了。
我已经从我的项目中提供了相关的代码部分。我没有包含来自我的服务层和实体层的代码,因为我知道它们正在工作。但是,如果需要,我也可以包括这些。用户与角色具有多对一关系。
用户控制器
/**
* display the user add page
*
* @return returns the view name
*/
@RequestMapping(value="/user/add", method=RequestMethod.GET)
public ModelAndView showUserAdd(ServletRequest request, @ModelAttribute("userModel") UserModel userModel, ModelMap modelmap) {
ModelMap modelMap = new ModelMap();
userModel.setUser(new User());
userModel.setRoles(userService.getRoles());
modelMap.addAttribute("userModel", userModel);
return new ModelAndView("user/add", modelMap);
}
/**
* handle post request to handle user creation, if successful displays user list page
*
* @param user User object from JSP
* @param result BindingResult from JSP
* @return returns view name
*/
@RequestMapping(value="/user/add", method=RequestMethod.POST)
public String userAdd(UserModel userModel, BindingResult result) {
if (result.hasErrors()) {
logger.warn("Error binding UserModel for /user/add, returning to previous page");
List<ObjectError> errors = result.getAllErrors();
for (ObjectError error : errors) {
logger.warn(error.getCode() + " - " + error.getDefaultMessage());
}
return "user/add";
}
try {
User user = userModel.getUser();
userService.addUser(user);
}
catch (DuplicateKeyException e) {
logger.warn("Duplicate record found in User table", e);
}
catch (Exception e) {
logger.error("Error occurred while trying to create a new user", e);
}
return "/user";
}
这是我传递给 JSP 女巫的模型,它包含一个用户对象,它是休眠实体,以及一个角色列表,另一个休眠实体。
import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.everesttech.recruiting.searchtool.entity.Role;
import com.everesttech.recruiting.searchtool.entity.User;
@Scope(value="request")
@Component("userModel")
public class UserModel {
public User user;
public List<Role> roles;
public UserModel() {
}
public UserModel(User user, List<Role> roles) {
this.user = user;
this.roles = roles;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
@Override
public String toString() {
return "UserModel [user=" + user + ", roles=" + roles + "]";
}
}
这是我的 JSP。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-8 col-md-6">
<h3>User - Add</h3>
<br>
<spring:hasBindErrors name="userModel">
<div class="alert alert-danger">
<sf:errors path="userModel.user.firstName"></sf:errors>
<sf:errors path="userModel.user.lastName"></sf:errors>
<sf:errors path="userModel.user.email"></sf:errors>
<sf:errors path="userModel.user.userName"></sf:errors>
<sf:errors path="userModel.user.password"></sf:errors>
<sf:errors path="userModel.user.role"></sf:errors>
</div>
</spring:hasBindErrors>
<c:url var="formAction" value="/user/add" />
<sf:form commandName="userModel" modelAttribute="userModel" method="post" action="${formAction}">
<div class="form-group">
<label for="first-name">First Name</label>
<sf:input path="user.firstName" id="first-name" class="form-control" placeholder="First Name" />
</div>
<div class="form-group">
<label for="last-name">Last Name</label>
<sf:input path="user.lastName" id="last-name" class="form-control" placeholder="Last Name" />
</div>
<div class="form-group">
<label for="email">Email</label>
<sf:input path="user.email" id="email" class="form-control" placeholder="Email" />
</div>
<div class="form-group">
<label for="user-name">Username</label>
<sf:input path="user.userName" id="user-name" class="form-control" placeholder="Username" />
</div>
<div class="form-group">
<label for="password">Password</label>
<sf:password path="user.password" id="password" class="form-control" placeholder="" />
</div>
<div class="form-group">
<label for="confirm-password">Confirm Password</label>
<input type="password" id="confirm-password" class="form-control" placeholder="" />
</div>
<div class="form-group">
<label for="role">Role</label>
<sf:select path="user.role" id="role" class="form-control" >
<c:forEach var="r" items="${userModel.roles}">
<sf:option value="${r.getId()}">${r.getFriendlyName()}</sf:option>
</c:forEach>
</sf:select>
</div>
<button type="submit" class="btn btn-default">Save</button>
<button type="button" class="btn btn-default">Cancel</button>
</sf:form>
</div>
</div>
</div>