spring forms bind exception-illegalstateexception:无法将[java.lang.string]类型的值转换为所需类型

igetnqfo  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(589)

我对spring和java比较新,正在使用jsp、jstl、hibernate/jpa和一个模型类让表单在springmvc中工作。我可以让页面显示得很好,但是应该创建用户的帖子给了我一个错误。

  1. 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

此错误是有意义的,因为窗体正在传回角色的id,而用户对象希望传递角色对象。但是,我不知道如何解决这个问题,同时仍然允许我的jsp由实际的实体对象支持,因为我想使用spring/hibernate验证。有没有一种方法可以证明这一点form:select as 角色对象?任何建议或解决方案都将不胜感激。提前谢谢。
我已经从我的项目中提供了代码的相关部分。我没有包含来自服务层和实体层的代码,因为我知道它们正在工作。不过,我可以包括这些以及如果需要。用户与角色具有多对一关系。
用户控制器

  1. /**
  2. * display the user add page
  3. *
  4. * @return returns the view name
  5. */
  6. @RequestMapping(value="/user/add", method=RequestMethod.GET)
  7. public ModelAndView showUserAdd(ServletRequest request, @ModelAttribute("userModel") UserModel userModel, ModelMap modelmap) {
  8. ModelMap modelMap = new ModelMap();
  9. userModel.setUser(new User());
  10. userModel.setRoles(userService.getRoles());
  11. modelMap.addAttribute("userModel", userModel);
  12. return new ModelAndView("user/add", modelMap);
  13. }
  14. /**
  15. * handle post request to handle user creation, if successful displays user list page
  16. *
  17. * @param user User object from JSP
  18. * @param result BindingResult from JSP
  19. * @return returns view name
  20. */
  21. @RequestMapping(value="/user/add", method=RequestMethod.POST)
  22. public String userAdd(UserModel userModel, BindingResult result) {
  23. if (result.hasErrors()) {
  24. logger.warn("Error binding UserModel for /user/add, returning to previous page");
  25. List<ObjectError> errors = result.getAllErrors();
  26. for (ObjectError error : errors) {
  27. logger.warn(error.getCode() + " - " + error.getDefaultMessage());
  28. }
  29. return "user/add";
  30. }
  31. try {
  32. User user = userModel.getUser();
  33. userService.addUser(user);
  34. }
  35. catch (DuplicateKeyException e) {
  36. logger.warn("Duplicate record found in User table", e);
  37. }
  38. catch (Exception e) {
  39. logger.error("Error occurred while trying to create a new user", e);
  40. }
  41. return "/user";
  42. }

这是我传递给jsp的模型,jsp包含一个用户对象(hibernate实体)和一个角色列表(另一个hibernate实体)。

  1. import java.util.List;
  2. import org.springframework.context.annotation.Scope;
  3. import org.springframework.stereotype.Component;
  4. import com.everesttech.recruiting.searchtool.entity.Role;
  5. import com.everesttech.recruiting.searchtool.entity.User;
  6. @Scope(value="request")
  7. @Component("userModel")
  8. public class UserModel {
  9. public User user;
  10. public List<Role> roles;
  11. public UserModel() {
  12. }
  13. public UserModel(User user, List<Role> roles) {
  14. this.user = user;
  15. this.roles = roles;
  16. }
  17. public User getUser() {
  18. return user;
  19. }
  20. public void setUser(User user) {
  21. this.user = user;
  22. }
  23. public List<Role> getRoles() {
  24. return roles;
  25. }
  26. public void setRoles(List<Role> roles) {
  27. this.roles = roles;
  28. }
  29. @Override
  30. public String toString() {
  31. return "UserModel [user=" + user + ", roles=" + roles + "]";
  32. }
  33. }

这是我的jsp。

  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  2. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
  3. <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
  4. <div class="container">
  5. <div class="row">
  6. <div class="col-xs-12 col-sm-8 col-md-6">
  7. <h3>User - Add</h3>
  8. <br>
  9. <spring:hasBindErrors name="userModel">
  10. <div class="alert alert-danger">
  11. <sf:errors path="userModel.user.firstName"></sf:errors>
  12. <sf:errors path="userModel.user.lastName"></sf:errors>
  13. <sf:errors path="userModel.user.email"></sf:errors>
  14. <sf:errors path="userModel.user.userName"></sf:errors>
  15. <sf:errors path="userModel.user.password"></sf:errors>
  16. <sf:errors path="userModel.user.role"></sf:errors>
  17. </div>
  18. </spring:hasBindErrors>
  19. <c:url var="formAction" value="/user/add" />
  20. <sf:form commandName="userModel" modelAttribute="userModel" method="post" action="${formAction}">
  21. <div class="form-group">
  22. <label for="first-name">First Name</label>
  23. <sf:input path="user.firstName" id="first-name" class="form-control" placeholder="First Name" />
  24. </div>
  25. <div class="form-group">
  26. <label for="last-name">Last Name</label>
  27. <sf:input path="user.lastName" id="last-name" class="form-control" placeholder="Last Name" />
  28. </div>
  29. <div class="form-group">
  30. <label for="email">Email</label>
  31. <sf:input path="user.email" id="email" class="form-control" placeholder="Email" />
  32. </div>
  33. <div class="form-group">
  34. <label for="user-name">Username</label>
  35. <sf:input path="user.userName" id="user-name" class="form-control" placeholder="Username" />
  36. </div>
  37. <div class="form-group">
  38. <label for="password">Password</label>
  39. <sf:password path="user.password" id="password" class="form-control" placeholder="" />
  40. </div>
  41. <div class="form-group">
  42. <label for="confirm-password">Confirm Password</label>
  43. <input type="password" id="confirm-password" class="form-control" placeholder="" />
  44. </div>
  45. <div class="form-group">
  46. <label for="role">Role</label>
  47. <sf:select path="user.role" id="role" class="form-control" >
  48. <c:forEach var="r" items="${userModel.roles}">
  49. <sf:option value="${r.getId()}">${r.getFriendlyName()}</sf:option>
  50. </c:forEach>
  51. </sf:select>
  52. </div>
  53. <button type="submit" class="btn btn-default">Save</button>
  54. <button type="button" class="btn btn-default">Cancel</button>
  55. </sf:form>
  56. </div>
  57. </div>
  58. </div>
pgccezyw

pgccezyw1#

对于任何感兴趣的人,我在spring文档中找到了一个解决方案。我必须创建一个类来处理从字符串到角色的转换并注册它。这需要访问数据库来创建role对象,但我看不到其他处理方法。
这是我的课。

  1. import javax.inject.Inject;
  2. import org.springframework.core.convert.converter.Converter;
  3. import com.everesttech.recruiting.searchtool.dao.RoleDao;
  4. import com.everesttech.recruiting.searchtool.entity.Role;
  5. final class StringToRole implements Converter<String, Role> {
  6. @Inject
  7. RoleDao roleDao;
  8. @Override
  9. public Role convert(String source) {
  10. return roleDao.find(Long.parseLong(source));
  11. }
  12. }

我在mvc-context.xml文件中添加/编辑了以下内容。

  1. <!-- Enables the Spring MVC @Controller programming model -->
  2. <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
  3. <bean id="conversionService"
  4. class="org.springframework.context.support.ConversionServiceFactoryBean">
  5. <property name="converters">
  6. <list>
  7. <bean class="com.examplecompany.exampleapp.example.converter.StringToRole"/>
  8. </list>
  9. </property>
  10. </bean>

这个工作,我现在可以提交没有问题的形式。但是,当用户对象不满足验证要求时,我的hibernate验证不会出现在jsp上。例如,first name有一个@notblank注解。我可以看到它被检测到,我正在记录它。但是,它们不会出现在form:error tags. 如果有人知道如何解决这个问题,请告诉我。

展开查看全部

相关问题